Du kan ikke DECLARE
(globale) variabler (der er løsninger
) eller loop med almindelig SQL - med undtagelse af rekursive CTE'er som leveret af @bma
(hvilket faktisk er iterating over rækker, ikke looping, strengt taget).
Men , der er DO
erklæring
for sådanne ad hoc-procedureregler. Introduceret med Postgres 9.0. Den fungerer som en engangsfunktion, men tager ingen parametre og returnerer ikke noget. Du kan RAISE
bemærkninger et al, så dit eksempel ville bare fungere fint:
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$
Hvis ikke andet er angivet, er sproget i brødteksten som standard plpgsql
. Du kan bruge ethvert registreret proceduresprog
dog, hvis du erklærer det (som:LANGUAGE plpython
).
Postgres tilbyder også generate_series()
at generere sæt ad-hoc, hvilket kan undgå behovet for looping i mange tilfælde. Prøv en søgning her på SO for eksempler.
Du kan også bruge WHERE
klausul i en datamodificerende CTE
i almindelig SQL for at fordele sager og efterligne IF .. THEN .. ELSE .. END
...