Vous ne pouvez pas DECLARE
variables (globales) (il existe solutions de contournement
) ni boucle avec du SQL brut - à l'exception des CTE récursifs fournis par @bma
(qui est en fait itérant sur les lignes, pas en boucle à proprement parler).
Cependant , il y a le DO
déclaration
pour un tel code de procédure ad hoc. Introduit avec Postgres 9.0. Elle fonctionne comme une fonction à usage unique, mais ne prend aucun paramètre et ne renvoie rien. Vous pouvez RAISE
notices et al, donc votre exemple fonctionnerait bien :
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$
Sauf indication contraire, la langue dans le corps est par défaut plpgsql
. Vous pouvez utiliser tout langage procédural enregistré
cependant, si vous le déclarez (comme :LANGUAGE plpython
).
Postgres propose également generate_series()
pour générer des ensembles ad hoc, ce qui peut éviter le besoin de boucler dans de nombreux cas. Essayez une recherche ici sur SO pour des exemples.
Vous pouvez également utiliser le WHERE
clause dans un modification de données CTE
en SQL simple pour bifurquer les cas et émuler IF .. THEN .. ELSE .. END
...