PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

O PostgreSQL faz loops fora das funções. Isso é possível?


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 ...