PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL esegue cicli esterni alle funzioni. È possibile?

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