nie możesz DECLARE
(globalne) zmienne (są są obejścia
) ani loop ze zwykłym SQL - z wyjątkiem rekurencyjnych CTE dostarczonych przez @bma
(co w rzeczywistości jest iteracją ponad rzędami, nie zapętlając się, mówiąc ściśle).
Jednak , istnieje DO
oświadczenie
dla takiego doraźnego kodeksu proceduralnego. Wprowadzony wraz z Postgresem 9.0. Działa jak funkcja jednorazowa, ale nie przyjmuje żadnych parametrów i niczego nie zwraca. Możesz RAISE
uwagi i inni, więc twój przykład będzie działał dobrze:
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$
Jeśli nie określono inaczej, domyślnym językiem w treści jest plpgsql
. Możesz użyć dowolnego zarejestrowanego języka proceduralnego
chociaż, jeśli to zadeklarujesz (na przykład:LANGUAGE plpython
).
Postgres oferuje również generate_series()
do generowania zestawów ad-hoc, co może w wielu przypadkach wyeliminować potrzebę zapętlania. Spróbuj poszukać przykładów tutaj w SO.
Możesz także użyć WHERE
klauzula w CTE modyfikacji danych
w zwykłym SQL do rozwidlenia przypadków i emulacji IF .. THEN .. ELSE .. END
...