A MySQL tárolt eljárásokban a ciklusokat az WHILE, REPEAT és LOOP utasításokkal valósíthatjuk meg. Ezek az utasítások lehetővé teszik, hogy egy adott kódrészletet többször is végrehajtsunk, amíg egy feltétel teljesül.
| Ciklus típus | Kulcsszó | Alapvető jellemzők |
|---|---|---|
| WHILE | WHILE / END WHILE | Előltesztelő ciklus, amely addig fut, amíg a feltétel igaz |
| REPEAT | REPEAT / UNTIL / END REPEAT | Hátultesztelő ciklus, amely addig fut, amíg a feltétel hamis |
| LOOP | LOOP / END LOOP | Alapvető, végtelen ciklus, amelyet LEAVE paranccsal lehet megszakítani |
Az előltesztelő WHILE ciklus addig fut, amíg a megadott feltétel teljesül (vagyis igaz).
A WHILE ciklus szintaxisa:
WHILE feltétel DO
-- utasítások
END WHILE;
A REPEAT ciklus legalább egyszer lefut, majd addig ismétli magát, amíg az UNTIL feltétel igazzá nem válik.
A REPEAT ciklus szintaxisa:
REPEAT
-- utasítások
UNTIL feltétel;
END REPEAT;
A LOOP ciklus folyamatosan ismétlődik, amíg explicit módon (szándékosan, közvetlenül) meg nem szakítjuk. (A LEAVE utasítással lépünk ki a ciklusból.)
A LOOP ciklus szintaxisa:
LOOP_label: LOOP
-- utasítások
IF feltétel THEN
LEAVE LOOP;
END IF;
END LOOP LOOP_label;
A LOOP ciklus vezérlő kulcsszavai:
Példa a ciklusok bemutatására:
Tegyük fel, hogy van egy szamok tábla, amelyben egész számokat tárolunk. Szeretnénk kiírni az első 5 számot.
CREATE TABLE szamok (id INT AUTO_INCREMENT, szam INT, PRIMARY KEY (id));
INSERT INTO szamok (szam) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
DELIMITER //
CREATE PROCEDURE while_pelda()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= 5 DO
SELECT szam FROM szamok WHERE id = i;
SET i = i + 1;
END WHILE;
END//
DELIMITER ;
CALL while_pelda();
DELIMITER //
CREATE PROCEDURE repeat_pelda()
BEGIN
DECLARE i INT DEFAULT 1;
REPEAT
SELECT szam FROM szamok WHERE id = i;
SET i = i + 1;
UNTIL i > 5
END REPEAT;
END//
DELIMITER ;
CALL repeat_pelda();
DELIMITER //
CREATE PROCEDURE loop_pelda()
BEGIN
DECLARE i INT DEFAULT 1;
loop_label: LOOP
SELECT szam FROM szamok WHERE id = i;
SET i = i + 1;
IF i > 5 THEN
LEAVE loop_label;
END IF;
END LOOP;
END//
DELIMITER ;
CALL loop_pelda();
szamok táblából a páros számokat:DELIMITER //
CREATE PROCEDURE paros_szamok()
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE db INT;
SELECT count(szam) INTO db FROM szamok;
paros_label: LOOP
SET i = i + 1;
-- Páratlan számok kihagyása
IF (i % 2 = 1) THEN
ITERATE paros_label;
ELSE
SELECT szam FROM szamok WHERE id = i;
END IF;
-- Kilépés, ha elértük az utolsó rekordot
IF i = db THEN
LEAVE paros_label;
END IF;
END LOOP;
END//
DELIMITER ;
CALL paros_szamok();