PostgreSQL – Para bucles

PostgreSQL proporciona declaraciones de bucle for para iterar sobre un rango de enteros o sobre un conjunto de resultados o sobre el conjunto de resultados de una consulta dinámica. Los diferentes usos del bucle for en PostgreSQL se describen a continuación:

1. For loop para iterar sobre un rango de enteros

La sintaxis de la declaración de bucle for para iterar sobre un rango de enteros:

[ <<label>> ]
for loop_cnt in [ reverse ] from.. to [ by step ] loop
    statements
end loop [ label ];

Si analizamos la sintaxis anterior:

  • Primero se crea una variable entera loop_cnt , a la que solo se puede acceder dentro del bucle. Después de cada iteración, el ciclo for agrega el paso a loop_cnt . Sin embargo, cuando usamos la opción inversa, el ciclo for resta el paso de loop_cnt después de cada iteración.
  • Para especificar el límite inferior y superior del rango, usamos las expresiones from y to . Antes de entrar en el ciclo, el ciclo for evalúa estas expresiones.
  • El paso que sigue a la palabra clave by especifica el paso de iteración con 1 como valor predeterminado. Esta expresión escalonada se evalúa solo una vez.

El siguiente diagrama de flujo describe la instrucción del bucle for:

Diagrama de flujo del bucle For

Ejemplo 1:

El siguiente código usa la declaración de bucle for para iterar sobre diez números del 1 al 10 y mostrar cada uno de ellos en cada iteración:

do $$
begin
   for cnt in 1..10 loop
    raise notice 'cnt: %', cnt;
   end loop;
end; $$

Producción:

Ejemplo 2:

El siguiente código usa la declaración de bucle for para iterar sobre diez números del 10 al 1 y mostrar cada uno de ellos en cada iteración:

do $$
begin
   for cnt in reverse 10..1 loop
      raise notice 'cnt: %', cnt;
   end loop;
end; $$

Producción:

2. For loop para iterar sobre un conjunto de resultados

La sintaxis de la declaración de bucle for para iterar sobre un conjunto de resultados de una consulta:

[ <<label>> ]
for target in query loop
    statements
end loop [ label ];

Primero, creamos una tabla de muestra usando los siguientes comandos para realizar ejemplos:

CREATE TABLE employees (
  employee_id serial PRIMARY KEY,
  full_name VARCHAR NOT NULL,
  manager_id INT
);

Luego insertamos datos en nuestra tabla de empleados de la siguiente manera:

INSERT INTO employees (
  employee_id,
  full_name,
  manager_id
)
VALUES
  (1, 'M.S Dhoni', NULL),
  (2, 'Sachin Tendulkar', 1),
  (3, 'R. Sharma', 1),
  (4, 'S. Raina', 1),
  (5, 'B. Kumar', 1),
  (6, 'Y. Singh', 2),
  (7, 'Virender Sehwag ', 2),
  (8, 'Ajinkya Rahane', 2),
  (9, 'Shikhar Dhawan', 2),
  (10, 'Mohammed Shami', 3),
  (11, 'Shreyas Iyer', 3),
  (12, 'Mayank Agarwal', 3),
  (13, 'K. L. Rahul', 3),
  (14, 'Hardik Pandya', 4),
  (15, 'Dinesh Karthik', 4),
  (16, 'Jasprit Bumrah', 7),
  (17, 'Kuldeep Yadav', 7),
  (18, 'Yuzvendra Chahal', 8),
  (19, 'Rishabh Pant', 8),
  (20, 'Sanju Samson', 8);

La mesa es:

Ejemplo 3:

El siguiente código usa la declaración de bucle for para iterar sobre los 10 ID de empleados más grandes:

do
$$
declare
    f record;
begin
    for f in select employee_id, full_name 
           from employees 
           order by employee_id desc, full_name
           limit 10 
    loop 
    raise notice '% - % ', f.employee_id, f.full_name;
    end loop;
end;
$$;

Producción:
 

3. For loop para iterar sobre el conjunto de resultados de una consulta dinámica

La sintaxis de la declaración de bucle for para iterar sobre un conjunto de resultados de una consulta dinámica:

[ <<label>> ]
for row in execute query_expression [ using query_param [, ... ] ] 
loop
    statements
end loop [ label ];

Si analizamos la sintaxis anterior:

  • query_expression es una instrucción SQL.
  • La cláusula de uso se utiliza para pasar los parámetros de consulta.

Ejemplo 4:

El siguiente código muestra cómo usar la instrucción de bucle for para recorrer una consulta dinámica. Tiene las siguientes dos variables de configuración:

  • sort_type: 1 para ordenar por ID de empleado, 2 para ordenar por longitud de nombre
  • rec_count: es el número de registros a consultar de la tabla.
do $$
declare
    -- sort by 1: employee_id , 2: length of name 
    sort_type smallint := 1; 
    -- return the number of films
    rec_count int := 10;
    -- use to iterate over the film
    rec record;
    -- dynamic query
    query text;
begin
        
    query := 'select full_name, employee_id from employees ';
    
    if sort_type = 1 then
        query := query || 'order by employee_id desc ';
    elsif sort_type = 2 then
      query := query || 'order by length(full_name) desc ';
    else 
       raise 'invalid sort type %s', sort_type;
    end if;

    query := query || ' limit $1';

    for rec in execute query using rec_count
        loop
         raise notice '% - %', rec.employee_id, rec.full_name;
    end loop;
end;
$$

Producción:

Si cambiamos sort_type a 2, obtendremos el siguiente resultado:

Publicación traducida automáticamente

Artículo escrito por kishankr11710428 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *