Estoy creando un procedimiento almacenado pasando un tipo y haciendo un bucle dentro del procedimiento para poder insertar cada tipo de información
este es mi tipo
create type leketo as(id integer, name text);Función que inserta filas en mi tipo
CREATE OR REPLACE FUNCTION getLeketo() RETURNS SETOF leketo AS $BODY$ declare l leketo; begin l.id := 1; l.name := 'One'; return next l; l.id := 2; l.name := 'Two'; return next l; l.id := 3; l.name := 'Three'; return next l; l.id := 4; l.name := 'Four'; return next l; l.id := 5; l.name := 'Five'; return next l; end $BODY$ LANGUAGE plpgsql VOLATILE;Ejecutar la función me devuelve esto
select * from getLeketo() 1 One 2 Two 3 Three 4 Four 5 FiveEn este procedimiento recorreremos todas las filas
CREATE OR REPLACE FUNCTION loopLeketo(pl leketo) RETURNS void AS $BODY$ declare l leketo; begin for l in (select * from pl) loop raise notice '----------------------------------------'; raise notice 'id=%, name=%', l.id, l.name; end loop; end $BODY$ LANGUAGE plpgsql VOLATILE;Si pruebo esto me sale el siguiente mensaje
DO $$ declare l leketo; begin select * from getLeketo() into l; PERFORM loopLeketo(l); end$$;ERROR: relación "pl" no existe
Recibe ese mensaje de error porque un parámetro (en su caso, pl ) no puede aparecer en la cláusula FROM de una consulta, por lo que PostgreSQL interpretará pl como un nombre de tabla.
El problema más profundo es que intenta asignar un conjunto de valores a una sola variable, lo que no funcionará. Su declaración SELECT ... INTO solo almacenará el primer resultado en la variable l .
No nos dice lo que realmente quiere lograr, pero puedo pensar en dos enfoques para el problema que muestra:
Manejar los resultados de la consulta uno por uno. El código PL/pgSQL se vería así:
DEFINE l leketo; BEGIN FOR l IN SELECT * FROM getleketo() LOOP RAISE NOTICE 'id=%, name=%', l.id, l.name; END LOOP; END; Defina getleketo() no como RETURNS SETOF leketo , sino como RETURNS refcursor y haga que devuelva un cursor para los resultados. Luego puede asignar el resultado completo de la consulta a una variable de tipo refcursor y usar esto como argumento para la función loopleketo .
Consulte la documentación para obtener más información.