CodeGym /Kurse /SQL SELF /Abbruch und Fortsetzung von Schleifen: EXIT, CONTINUE

Abbruch und Fortsetzung von Schleifen: EXIT, CONTINUE

SQL SELF
Level 51 , Lektion 2
Verfügbar

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.

2
Aufgabe
SQL SELF, Level 51, Lektion 2
Gesperrt
Überspringen und Beenden einer Schleife zur Verarbeitung einer Student:innenliste
Überspringen und Beenden einer Schleife zur Verarbeitung einer Student:innenliste
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION