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:
LOOP— eine universelle Schleife, die so lange läuft, bis du sie explizit stoppst.FOR— eine Schleife mit einer festgelegten Anzahl von Durchläufen über einen Zahlenbereich oder das Ergebnis einer Abfrage.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 $$;
- Die Variable
counterwird bei jedem Durchlauf erhöht. - Die Bedingung
IF counter > 10 THEN EXIT;beendet die Schleife, wenn der Zähler größer als 10 ist. - Am Ende wird die Summe der Zahlen ausgegeben.
Schleife über einen Bereich oder Datensatz: FOR
Die zweite Schleifenart, FOR, wird verwendet, um über:
- einen Zahlenbereich zu iterieren.
- 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.
GO TO FULL VERSION