Je kan niet DECLARE
(globale) variabelen (er zijn tijdelijke oplossingen
) noch loop met gewone SQL - met uitzondering van recursieve CTE's zoals geleverd door @bma
(wat eigenlijk itererend is over rijen, strikt genomen niet in een lus).
Echter , er is de DO
verklaring
voor een dergelijke ad-hoc procedurele code. Geïntroduceerd met Postgres 9.0. Het werkt als een eenmalige functie, maar neemt geen parameters in beslag en retourneert niets. U kunt RAISE
mededelingen et al, dus uw voorbeeld zou prima werken:
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$
Indien niet anders gespecificeerd, is de taal in de body standaard plpgsql
. U kunt elke geregistreerde proceduretaal
gebruiken echter, als je het declareert (zoals:LANGUAGE plpython
).
Postgres biedt ook generate_series()
om ad-hoc sets te genereren, wat in veel gevallen de noodzaak van looping overbodig maakt. Probeer hier op SO te zoeken voor voorbeelden.
U kunt ook de WHERE
. gebruiken clausule in een gegevensmodificerende CTE
in gewone SQL om gevallen te forken en IF .. THEN .. ELSE .. END
te emuleren ...