Das können Sie nicht DECLARE
(globale) Variablen (es gibt Problemumgehungen
) noch Schleife mit einfachem SQL - mit Ausnahme von rekursiven CTEs wie von @bma
bereitgestellt (was eigentlich eine Iteration ist über Zeilen, nicht Schleifen, genau genommen).
Allerdings , gibt es den DO
Erklärung
für eine solche Ad-hoc-Verfahrensordnung. Eingeführt mit Postgres 9.0. Sie funktioniert wie eine Einmalfunktion, nimmt aber keine Parameter entgegen und gibt nichts zurück. Sie können RAISE
Notices et al., also würde Ihr Beispiel gut funktionieren:
DO
$do$
DECLARE
_counter int := 0;
BEGIN
WHILE _counter < 10
LOOP
_counter := _counter + 1;
RAISE NOTICE 'The counter is %', _counter; -- coerced to text automatically
END LOOP;
END
$do$
Wenn nicht anders angegeben, ist die Sprache im Hauptteil standardmäßig plpgsql
. Sie können jede registrierte Verfahrenssprache
verwenden Wenn Sie es jedoch deklarieren (wie:LANGUAGE plpython
).
Postgres bietet auch generate_series()
Sätze ad-hoc zu generieren, was in vielen Fällen die Notwendigkeit einer Schleife vermeiden kann. Suchen Sie hier auf SO nach Beispielen.
Sie können auch WHERE
verwenden -Klausel in einem datenmodifizierenden CTE
in einfachem SQL, um Fälle zu forken und IF .. THEN .. ELSE .. END
zu emulieren ...