PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL-Schleifen außerhalb von Funktionen. Ist das möglich?

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 ...