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.