Hauptmenü

Untermenü

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 1UNTIL 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 1END 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_nameLOOP
  ...
END LOOP;  

Der Ausstiegspunkt

Dazu benötigt man eine Bedingung, zu der ich im Anschluss komme.


loop_nameLOOP
  [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_nameLOOP
  [ANFANG BEDINGUNG]
    ITERATE loop_name;
  [ENDE BEDINGUNG]
END LOOP;  

zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt