CodeGym /Kurse /SQL SELF /Schleifen verwenden: LOOP, FOR, WHILE in PL/pgSQL

Schleifen verwenden: LOOP, FOR, WHILE in PL/pgSQL

SQL SELF
Level 51 , Lektion 1
Verfügbar

Schleifen ermöglichen es dir, einen Codeblock mehrmals hintereinander auszuführen, solange eine bestimmte Bedingung erfüllt ist oder solange du über eine Datenmenge iterierst. Das ist mega praktisch, um Aufgaben zu automatisieren, große Datenmengen zu bearbeiten oder wiederkehrende Aktionen auszuführen.

Stell dir vor, du müsstest jedem Kind in der Gruppe per Hand ein Bonbon geben. Das wäre totales Chaos! Stattdessen kannst du einfach die Liste der Kinder durchgehen und jedem nacheinander ein Bonbon geben. In diesem Szenario ist das "Durchgehen der Liste" eine Schleife.

In PostgreSQL gibt es mehrere Arten von Schleifen:

  1. LOOP — eine universelle Schleife, die so lange läuft, bis du sie explizit stoppst.
  2. FOR — eine Schleife mit einer festgelegten Anzahl von Durchläufen über einen Zahlenbereich oder das Ergebnis einer Abfrage.
  3. WHILE — eine Schleife, die läuft, solange die Bedingung wahr ist.

Lass uns jede Art einzeln anschauen.

Endlosschleife: LOOP

LOOP ist die einfachste Form der Schleife in PL/pgSQL, die einen Codeblock wiederholt. Diese Schleife läuft endlos, und du musst sie manuell mit dem Befehl EXIT beenden.

Syntax:

LOOP
    -- Dein Code hier
END LOOP;

Hier ein Beispiel. Lass uns die Summe der Zahlen von 1 bis 10 mit LOOP berechnen:

DO $$
DECLARE
    counter INT := 1;
    sum INT := 0;
BEGIN
    LOOP
        sum := sum + counter; -- aktueller Wert des Zählers addieren
        counter := counter + 1; -- Zähler erhöhen

        -- Schleife beenden, wenn der Zähler größer als 10 ist
        IF counter > 10 THEN
            EXIT;
        END IF;
    END LOOP;

    RAISE NOTICE 'Summe der Zahlen von 1 bis 10: %', sum;
END $$;
  1. Die Variable counter wird bei jedem Durchlauf erhöht.
  2. Die Bedingung IF counter > 10 THEN EXIT; beendet die Schleife, wenn der Zähler größer als 10 ist.
  3. Am Ende wird die Summe der Zahlen ausgegeben.

Schleife über einen Bereich oder Datensatz: FOR

Die zweite Schleifenart, FOR, wird verwendet, um über:

  1. einen Zahlenbereich zu iterieren.
  2. das Ergebnis einer SQL-Abfrage zu gehen.

Schleife über einen Zahlenbereich

Syntax:

FOR variable IN [REVERSE] start..end LOOP
    -- Dein Code hier
END LOOP;

Lass uns die Zahlen von 1 bis 5 ausgeben:

DO $$
BEGIN
    FOR i IN 1..5 LOOP
        RAISE NOTICE 'Aktueller Wert: %', i;
    END LOOP;
END $$;

Beispiel in umgekehrter Reihenfolge:

DO $$
BEGIN
    FOR i IN REVERSE 5..1 LOOP
        RAISE NOTICE 'Umgekehrte Reihenfolge: %', i;
    END LOOP;
END $$;

Schleife über das Ergebnis einer SQL-Abfrage

Diese Variante ist praktisch, um Zeilen einer Tabelle zu verarbeiten.

Syntax:

FOR variable IN QUERY (SELECT ...) LOOP
    -- Dein Code hier
END LOOP;

Hier ein Beispiel für die Iteration über die Zeilen der Tabelle students:

DO $$
DECLARE
    student_name TEXT;
BEGIN
    FOR student_name IN QUERY (SELECT name FROM students) LOOP
        RAISE NOTICE 'Hallo, %!', student_name;
    END LOOP;
END $$;

Bedingte Schleife: WHILE

WHILE läuft, solange die angegebene Bedingung wahr ist.

Syntax:

WHILE Bedingung LOOP
    -- Dein Code hier
END LOOP;

Lass uns die Summe der Zahlen von 1 bis 10 mit WHILE berechnen:

DO $$
DECLARE
    counter INT := 1;
    sum INT := 0;
BEGIN
    WHILE counter <= 10 LOOP
        sum := sum + counter;
        counter := counter + 1;
    END LOOP;

    RAISE NOTICE 'Summe der Zahlen von 1 bis 10: %', sum;
END $$;

Beispiele aus dem echten Leben

Jetzt, wo wir die Grundlagen der Schleifen kennen, schauen wir uns mal an, wie man sie praktisch einsetzen kann.

Beispiel 1: Multiplikationstabelle generieren

DO $$
DECLARE
    i INT;
    j INT;
BEGIN
    FOR i IN 1..5 LOOP
        FOR j IN 1..5 LOOP
            RAISE NOTICE '% x % = %', i, j, i * j;
        END LOOP;
    END LOOP;
END $$;

Beispiel 2: Iteration über das Ergebnis einer Abfrage. Angenommen, wir haben eine Tabelle products mit den Feldern id und price. Wir erhöhen alle Preise um 10%.

DO $$
DECLARE
    prod RECORD;
BEGIN
    FOR prod IN QUERY (SELECT id, price FROM products) LOOP
        UPDATE products
        SET price = prod.price * 1.1
        WHERE id = prod.id;
    END LOOP;
END $$;

Typische Fehler und wie du sie vermeidest

Endlosschleife in LOOP oder WHILE. Wenn du vergisst, eine Abbruchbedingung (EXIT oder eine sinnvolle Bedingung in WHILE) einzubauen, endet die Schleife nie. Das ist ungefähr so, als würdest du ein Auto ohne Bremsen fahren.

Fehler bei der Iteration über das Abfrageergebnis. Wenn die Struktur der Ergebnisdaten nicht wie erwartet ist, kann es zu Fehlern in der FOR IN QUERY-Schleife kommen.

Unoptimierte Abfragen innerhalb von Schleifen. Zum Beispiel kann ein UPDATE in jeder Iteration die Ausführung stark verlangsamen. In solchen Fällen ist es besser, eine einzige SQL-Abfrage statt einer Schleife zu verwenden.

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION