Du kan inte DECLARE
(globala) variabler (det finns lösningar
) eller loop med vanlig SQL - med undantag för rekursiva CTE:er som tillhandahålls av @bma
(vilket faktiskt är iterating över rader, inte looping, strängt taget).
Men , det finns DO
uttalande
för en sådan ad hoc-processkod. Introducerad med Postgres 9.0. Den fungerar som en engångsfunktion, men tar inga parametrar och returnerar ingenting. Du kan RAISE
notiser et al, så ditt exempel skulle bara fungera bra:
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$
Om inget annat anges, är språket i brödtexten som standard plpgsql
. Du kan använda alla registrerade procedurspråk
dock om du deklarerar det (som:LANGUAGE plpython
).
Postgres erbjuder även generate_series()
att generera uppsättningar ad-hoc, vilket kan undvika behovet av looping i många fall. Försök att söka här på SO för exempel.
Du kan också använda WHERE
klausul i en datamodifierande CTE
i vanlig SQL för att dela upp fall och emulera IF .. THEN .. ELSE .. END
...