Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

178
Visualizações
Bucle de tipo compuesto como entrada de procedimiento almacenado PostgreSQL

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 Five

En 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

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

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:

  1. 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;
  2. 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.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda