Você não pode
DECLARE
variáveis (globais) (existem existem soluções alternativas
) nem loop com SQL simples - com exceção de CTEs recursivos conforme fornecido por @bma
(que na verdade é iter sobre linhas, não em loop, estritamente falando). No entanto , existe o
DO
declaração
para tal código de procedimento ad hoc. Introduzido com o Postgres 9.0. Funciona como uma função one-time, mas não recebe nenhum parâmetro e não retorna nada. Você pode RAISE
notices et al, então seu exemplo funcionaria bem: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$
Se não for especificado de outra forma, o idioma no corpo padrão é
plpgsql
. Você pode usar qualquer linguagem procedural registrada
no entanto, se você declarar (como:LANGUAGE plpython
). O Postgres também oferece
generate_series()
para gerar conjuntos ad-hoc, o que pode evitar a necessidade de loop em muitos casos. Tente pesquisar aqui no SO para obter exemplos.
Além disso, você pode usar o
WHERE
cláusula em um CTE de modificação de dados
em SQL simples para bifurcar casos e emular IF .. THEN .. ELSE .. END
...