PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PostgreSQL boucle en dehors des fonctions. Est-ce possible?

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