Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

425
Vistas
Error al crear una función en Postgres

Estoy tratando de crear una función de postgres que solo devuelva los amigos que un usuario tiene en la base de datos. Solo debe devolver el nombre y apellido de todos los amigos del usuario. Sin embargo, sigo recibiendo este error:

[42601] ERROR: query has no destination for result data

No tiene sentido para mí porque estoy devolviendo una tabla con todos los nombres y apellidos.

Aquí está mi función. ¿Alguien sabe por qué sería así? No pude encontrar la respuesta en ningún otro lado.

 create or replace function getFriends(pEmail text) returns TABLE(pkUser int, FirstName text, LastName text) language plpgsql as $$ declare pk int; begin select "pkUser" into pk from users where "Email"=pEmail; select "pkUser", "FirstName", "LastName" from users u inner join friends f on u."pkUser" = f."User2ID" where f."User1ID"=pk; select "pkUser", "FirstName", u."LastName" from users u inner join friends f on u."pkUser" = (f."User1ID") where f."User2ID"=pk; end $$;
over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Su consulta final no "consume" su resultado. en PL/pgSQL, el resultado de una consulta debe almacenarse en una variable (como lo hizo en su primera consulta) o descartarse usando perform o devolverse desde la función. Para hacer eso, use RETURN QUERY .

Puede combinar ambas consultas usando UNION ALL

 create or replace function getFriends(pEmail text) returns TABLE(pkUser int, FirstName text, LastName text) language plpgsql as $$ declare pk int; begin select "pkUser" into pk from users where "Email"=pEmail; return query select "pkUser", "FirstName", "LastName" from users u inner join friends f on u."pkUser" = f."User2ID" where f."User1ID"=pk union all select "pkUser", "FirstName", u."LastName" from users u inner join friends f on u."pkUser" = (f."User1ID") where f."User2ID"=pk; end $$;

Sin embargo, puede simplificar toda la función a una sola consulta y usar language sql en su lugar. La return query no es necesaria entonces.

 create or replace function getFriends(pEmail text) returns TABLE(pkUser int, FirstName text, LastName text) language sql as $$ select "pkUser", "FirstName", "LastName" from users u inner join friends f on u."pkUser" = f."User2ID" where f."User1ID" in (select "pkUser" from users where "Email" = pEmail) union all select "pkUser", "FirstName", u."LastName" from users u inner join friends f on u."pkUser" = f."User1ID" where f."User2ID" in (select "pkUser" from users where "Email" = pEmail); $$;
over 4 years ago · Santiago Trujillo Denunciar

0

Su función plpgsql debe return query para que sea válida.

Pero aquí creo que puedes hacer lo que quieras con una consulta directa, así que simplemente cambia a sql y:

 create or replace function getFriends(pEmail text) returns table(pkUser int, FirstName text, LastName text) language sql as $$ select u2."pkUser", u2."FirstName", u2."LastName" from users u1 inner join friends f on u1."pkUser" in (f."User1ID", f."User2ID") inner join users u2 on u2."pkUser" in (f."User1ID", f."User2ID") and u2."pkUser" <> u1."pkUser" where u1."Email" = pEmail; $$

Esto selecciona el registro del usuario cuyo correo electrónico se proporciona como argumento para la función, luego busca todos los amigos correspondientes (ya sea en User1ID o User2ID ) y finalmente devuelve el registro de usuario amigo.

over 4 years ago · Santiago Trujillo Denunciar

0

Use SELECT ... INTO ... para almacenar los resultados de la consulta

O

abrir un cursor

O

use PERFORM ... en el caso improbable de que no le importe el conjunto de resultados.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda