Advanced MySQL - Zwischenspeicherung - Routinen - Schleifen
1. REPEAT
Diese Schleife wird sehr gerne im Zusammenhang mit Cursorn genommen. Zuerst zeig ich mal einen beispielhaften Aufbau.
DECLARE done BOOLEAN DEFAULT FALSE;
DECLARE cur CURSOR FOR SELECT * FROM blubb;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=TRUE;
OPEN job;
REPEAT
...
UNTIL done
END REPEAT;
CLOSE job;
Erläuterung
Mit DECLARE done BOOLEAN DEFAULT FALSE;
legt man eine Variable für die Bedingung fest. Als nächstes kommt dann der
entsprechende Handler (DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=TRUE;
) mit dem man vorgibt "Mach solange
nichts, wie die Cursor-Abfrage etwas findet.
Wichtig
Ein Cursor läuft ... und läuft ... und läuft. Bis ihm die Puste ausgeht. Oder genauer gesagt, wenn kein entsprechender Datensatz
mehr gefunden wird. Dann schmeißt MySQL uns den Fehlercode 02000
um die Ohren. Und genau der wird hier abgefangen.
Die Schleife selber startet man mit REPEAT
. Die eigentliche Bedingung findet man aber erst nach den Statements in der
Schleife beim UNTIL
. Abgeschlossen wird das Ganze mit END REPEAT
.
Noch ein einfaches Beispiel
DECLARE i INT;
SET i = 1;
REPEAT
...
SET i = i + 1;
UNTIL i > 10
END REPEAT;
2. WHILE
Die funktioniert praktisch genau so wie die REPEAT
-Schleife. Nur ist der Aufbau etwas übersichtlicher.
DECLARE i INT;
SET i = 1;
WHILE i < 10 DO
...
SET i = i + 1;
END WHILE;
3. LOOP
Diese Schleifenform stellt eine kleine Besonderheit dar. Denn sie ermöglicht es, einen Ausstiegspunkt zu definieren, ähnlich wie
break
in PHP oder JavaScript. man kann auch eine Art von continue
einbauen. Der grundsätzliche Aufbau
sieht so aus.
SET i = 1;
loop_name: LOOP
...
END LOOP;
Der Ausstiegspunkt
Dazu benötigt man eine Bedingung, zu der ich im Anschluss komme.
loop_name: LOOP
[ANFANG BEDINGUNG]
LEAVE loop_name;
[ENDE BEDINGUNG]
END LOOP;
Keine Ahnung wieso, aber darum muss ein LOOP
immer einen Namen bekommen, damit man ihn ansteuern kann.
continue
Den Befehl kennt ihr ja schon aus PHP. Hier heißt er nur ein klein wenig anders und man muss auch wieder den Loop-Namen angeben.
loop_name: LOOP
[ANFANG BEDINGUNG]
ITERATE loop_name;
[ENDE BEDINGUNG]
END LOOP;
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt