Вие не можете DECLARE
(глобални) променливи (има има заобиколни решения
), нито цикъл с обикновен SQL - с изключение на рекурсивни CTE, предоставени от @bma
(което всъщност е итериране над редове, без зацикляне, строго погледнато).
Въпреки това , има DO
изявление
за такъв ad hoc процедурен код. Въведено с Postgres 9.0. Работи като еднократна функция, но не приема никакви параметри и не връща нищо. Можете да RAISE
забележки и др., така че вашият пример ще работи добре:
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$
Ако не е указано друго, езикът в тялото по подразбиране е plpgsql
. Можете да използвате всеки регистриран процедурен език
въпреки това, ако го декларирате (като:LANGUAGE plpython
).
Postgres също предлага generate_series()
за генериране на набори ad hoc, което може да премахне необходимостта от зацикляне в много случаи. Опитайте да търсите тук в SO за примери.
Освен това можете да използвате WHERE
клауза в CTE, модифицираща данни
в обикновен SQL за разклоняване на случаи и емулиране на IF .. THEN .. ELSE .. END
...