MySQL 5 – czego nie było wcześniej

Utrwalam sobie różnice między wersjami;)

Procedury składowane:

W wersji bez parametrów przekazywanych do procedury:

CREATE procedure select_all()
SELECT * FROM tabela;

Wywołanie procedury select_all:

CALL select_all()

W wersji z parametrami:

CREATE procedure select_one(IN szukane_id INT(11))
    SELECT * FROM tabela WHERE id=szukane_id;

Wywołanie procedury:

CALL select_one(3)

Usunięcie procedury:

DROP procedure select_one

W procedurach można korzystać z instrukcji warunkowej IF:

CREATE procedure ifik(IN zmienna INT)
 
BEGIN
    IF zmienna > 5
        SELECT * FROM tabela LIMIT zmienna;
    ELSE
        SELECT * FROM tabela LIMIT 5;
    END IF;
END;

Można zrobić coś w rodzaju instrukcji switch, tutaj nazywanej instrukcją CASE:

CREATE procedure casik(IN zmienna INT)
 
CASE zmienna
    WHEN 0 THEN SELECT * FROM tabela
    WHEN 1 THEN SELECT COUNT(*) FROM tabela
    ELSE SELECT FROM tabela LIMIT 5
END CASE;

Jak widać odpowiednikiem case’ów są konstrukcje WHEN, a zamiast default mamy ELSE.

Jest również pętla WHILE:

CREATE procedure whilik()
 
BEGIN
    DECLARE indeks INT;
    SET indeks = 1;
    WHILE indeks < 10 DO
        SELECT * FROM tabela WHERE id = indeks;
        SET indeks = indeks + 1;
    END WHILE;
END;

Niejako odwrotnością WHILE jest REPEAT:

CREATE procedure repeacik()
 
BEGIN
    DECLARE indeks INT DEFAULT 1;
    REPEAT
        SET indeks = indeks + 2;
        UNTIL j > 10
    END REPEAT
END;

Coś jak continue:

CREATE procedure iteracik()
 
BEGIN
    DECLARE indeks INT DEFAULT 1;
    etykieta: REPEAT
        SET indeks = indeks + 5;
        IF indeks = 20 THEN ITERATE etykieta; END IF;
        UNTIL indeks = 100
    END REPEAT etykieta;
END;

Procedury mogą prawie wszystko – jednak nie mogą zmieniać innych procedur, funkcji czy triggerów.

  • Grzesiek

    Witam nie wiesz może jak edytować istniejącą procedure?

  • Teoretycznie możliwe jest to poprzez alter nazwa_procedury, ale to póki co nie działa. Swego czasu testowałam to w wersji 5.0.3 i w paru późniejszych (również z 5.1 i 6.0) ale nic z tego.
    Jedynym więc sposobem jest usunięcie procedury i utworzenie jej od nowa.
    A zatem DROP PROCEDURE nazwa_procedury, a następnie CREATE PROCEDURE nazwa_procedury itd.