Non puoi DECLARE
variabili (globali) (ci ci sono soluzioni alternative
) né loop con SQL semplice, ad eccezione di CTE ricorsivi forniti da @bma
(che in realtà sta iterando su righe, non in loop, in senso stretto).
Tuttavia , c'è il DO
dichiarazione
per tale codice procedurale ad hoc. Introdotto con Postgres 9.0. Funziona come una funzione monouso, ma non accetta alcun parametro e non restituisce nulla. Puoi RAISE
notices et al, quindi il tuo esempio funzionerebbe bene:
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$
Se non diversamente specificato, la lingua nel corpo di default è plpgsql
. Puoi utilizzare qualsiasi linguaggio procedurale registrato
tuttavia, se lo dichiari (come:LANGUAGE plpython
).
Postgres offre anche generate_series()
per generare insiemi ad-hoc, il che può ovviare alla necessità di eseguire cicli in molti casi. Prova una ricerca qui su SO per esempi.
Inoltre, puoi usare il WHERE
clausola in un CTE di modifica dei dati
in semplice SQL per eseguire il fork dei casi ed emulare IF .. THEN .. ELSE .. END
...