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 $$;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); $$;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.
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.