Manchmal läuft in einer Schleife alles nach Plan – bis plötzlich ein Grund auftaucht, früher aufzuhören. Zum Glück gibt uns PL/pgSQL praktische Tools, um das Ganze zu steuern.
Schleife abbrechen mit EXIT
Manchmal muss eine Schleife beendet werden, bevor sie von selbst zu Ende ist. Das kann zum Beispiel passieren, wenn du einen bestimmten Wert gefunden hast, einen Fehler entdeckst oder die Iterationen nach einer bestimmten Bedingung stoppen willst. In solchen Fällen nutzen wir EXIT.
EXIT ist quasi die Art, der Schleife zu sagen: "Okay, reicht, du hast deinen Job gemacht, jetzt ist Schluss".
Der Syntax von EXIT ist super simpel:
EXIT WHEN bedingung;
Hier gibt das Schlüsselwort WHEN an, unter welcher Bedingung die Schleife beendet wird. Wenn du keine Bedingung angibst, beendet EXIT einfach sofort die aktuelle Schleife.
Beispiel: Schleife beenden, wenn ein bestimmter Wert gefunden wurde
Angenommen, wir haben eine Spalte mit Studentennummern und wollen den Studenten mit einer bestimmten ID finden. Sobald der Student gefunden ist, soll die Schleife beendet werden.
DO $$
DECLARE
student_id INT;
BEGIN
FOR student_id IN 1..100 LOOP
RAISE NOTICE 'Überprüfe Studenten-ID: %', student_id;
-- Wenn der gesuchte Student gefunden wurde, Schleife beenden
IF student_id = 42 THEN
RAISE NOTICE 'Student mit ID 42 gefunden!';
EXIT;
END IF;
END LOOP;
END $$;
In diesem Beispiel läuft die Schleife von 1 bis 100 und prüft jeden "Studenten". Sobald die ID 42 gefunden ist, gibt die Schleife eine Nachricht aus und beendet die Ausführung.
Iteration überspringen mit CONTINUE
Es gibt Situationen, in denen du innerhalb einer Schleife bestimmte Iterationen überspringen willst, aber trotzdem mit der nächsten weitermachen möchtest. Das ist besonders praktisch, wenn du "unnötige" Daten ignorieren oder Schritte für spezielle Bedingungen auslassen willst.
CONTINUE sagt: "Okay, diese Bedingung passt nicht, einfach zur nächsten Iteration springen".
CONTINUE funktioniert ähnlich wie EXIT, aber statt die Schleife zu beenden, überspringt es nur die aktuelle Iteration:
CONTINUE WHEN bedingung;
Wenn die Bedingung erfüllt ist, wird die aktuelle Iteration beendet und die nächste gestartet.
Beispiel: Gerade Zahlen überspringen
In diesem Beispiel laufen wir die Zahlen von 1 bis 10 durch, ignorieren aber die geraden Zahlen und geben nur die ungeraden aus.
DO $$
DECLARE
num INT;
BEGIN
FOR num IN 1..10 LOOP
-- Gerade Zahlen überspringen
IF num % 2 = 0 THEN
CONTINUE;
END IF;
RAISE NOTICE 'Ungerade Zahl: %', num;
END LOOP;
END $$;
Hier überspringt CONTINUE alle Iterationen, bei denen num % 2 = 0 (also die Zahl gerade ist). Das Ergebnis ist, dass nur ungerade Zahlen ins Log geschrieben werden.
Kombinieren von EXIT und CONTINUE
EXIT und CONTINUE kannst du zusammen nutzen, um die Schleife flexibler zu steuern. Zum Beispiel kannst du mit CONTINUE unnötige Iterationen überspringen, aber die ganze Schleife mit EXIT beenden, wenn etwas Wichtiges gefunden wurde.
Hier ein Beispiel, in dem wir alle Zahlen, die durch 3 teilbar sind, überspringen, aber die Schleife beenden, sobald wir bei der Zahl 15 angekommen sind.
DO $$
DECLARE
num INT;
BEGIN
FOR num IN 1..20 LOOP
-- Zahlen, die durch 3 teilbar sind, überspringen
IF num % 3 = 0 THEN
CONTINUE;
END IF;
-- Schleife beenden, wenn die Zahl 15 erreicht ist
IF num = 15 THEN
RAISE NOTICE 'Stoppe bei Zahl %', num;
EXIT;
END IF;
RAISE NOTICE 'Aktuelle Zahl: %', num;
END LOOP;
END $$;
Hier läuft die Schleife so ab:
- Zahlen, die durch 3 teilbar sind, werden übersprungen (
CONTINUE). - Wenn die Zahl 15 erreicht ist, wird die Schleife beendet (
EXIT). - Alle anderen Zahlen werden ausgegeben.
Fortgeschrittenes Beispiel: Ungültige Daten überspringen und bei kritischem Fehler abbrechen
Stellen wir uns jetzt eine realistischere Aufgabe vor. Wir wollen eine Liste von Studenten verarbeiten und dabei ihre Daten prüfen. Ungültige Einträge werden übersprungen, und bei einem "kritischen Fehler" wird die Verarbeitung abgebrochen.
DO $$
DECLARE
student RECORD;
BEGIN
FOR student IN
SELECT * FROM students
LOOP
-- Einträge mit ungültigen Daten überspringen
IF student.name IS NULL THEN
RAISE NOTICE 'Überspringe Student mit ID %: Name fehlt', student.id;
CONTINUE;
END IF;
-- Schleife bei kritischem Fehler abbrechen
IF student.status = 'ERROR' THEN
RAISE EXCEPTION 'Kritischer Fehler bei Student mit ID %', student.id;
EXIT; -- Diese Zeile ist eigentlich überflüssig, da RAISE EXCEPTION die Ausführung beendet.
END IF;
-- Eintrag verarbeiten
RAISE NOTICE 'Verarbeite Student: %', student.name;
END LOOP;
END $$;
In diesem Beispiel hilft CONTINUE, Studenten ohne Namen zu überspringen, und EXIT (zusammen mit RAISE EXCEPTION) beendet die Schleife, wenn ein schwerwiegender Fehler gefunden wird.
Praxistipps und typische Fehler
Vergiss nicht die Logik deiner Bedingungen. Falsche Bedingungen in EXIT WHEN oder CONTINUE WHEN können zu unerwartetem Verhalten führen. Zum Beispiel kann die Schleife zu früh enden oder wichtige Daten überspringen.
Zu viel CONTINUE ist auch nicht gut. Wenn dein Code voller CONTINUE-Checks ist, solltest du vielleicht die Logik der Schleife überdenken, um sie einfacher zu machen.
Verwechsele EXIT nicht mit RETURN. EXIT beendet nur die aktuelle Schleife, während RETURN die gesamte Funktion beendet.
Pass auf mit Endlosschleifen. Wenn du eine LOOP-Schleife ohne klare Abbruchbedingung nutzt, das EXIT vergisst, kann deine Schleife ewig laufen.
GO TO FULL VERSION