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