sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL realiza bucles fuera de las funciones. ¿Es eso posible?

no puedes DECLARE (globales) variables (hay son soluciones ) ni bucle con SQL simple, con la excepción de CTE recursivos proporcionados por @bma (que en realidad es iterando sobre filas, no en bucle, estrictamente hablando).

Sin embargo , existe el DO declaración para dicho código procesal ad-hoc. Introducido con Postgres 9.0. Funciona como una función única, pero no toma ningún parámetro y no devuelve nada. Puede RAISE Notices et al, por lo que su ejemplo funcionaría bien:

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$

Si no se especifica lo contrario, el idioma en el cuerpo por defecto es plpgsql . Puede usar cualquier idioma de procedimiento registrado sin embargo, si lo declara (como:LANGUAGE plpython ).

Postgres también ofrece generate_series() para generar conjuntos ad-hoc, lo que puede obviar la necesidad de bucles en muchos casos. Pruebe una búsqueda aquí en SO para ver ejemplos.

Además, puede usar el WHERE cláusula en un data-modification CTE en SQL simple para bifurcar casos y emular IF .. THEN .. ELSE .. END ...