Tárolt eljárások - ciklusok

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

Részletes leírás az egyes ciklus típusokról

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();
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();

Feladatok