在 Postgres 中创建函数时出错
Error when creating a function in Postgres
我正在尝试创建一个仅 return 用户在数据库中拥有的好友的 postgres 函数。它应该只是 return 所有用户朋友的名字和姓氏。但是,我不断收到此错误:
[42601] ERROR: query has no destination for result data
这对我来说没有意义,因为我 return 正在 table 中包含所有名字和姓氏。
这是我的功能。有谁知道为什么会这样?我在别处找不到答案。
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
$$;
使用SELECT ... INTO ...
存储查询结果
或
打开游标
或
在您不关心结果集的不太可能的情况下使用 PERFORM ...
。
您的最终查询不会“使用”其结果。在 PL/pgSQL 中,查询的结果要么需要存储到变量中(就像您在第一个查询中所做的那样),要么使用 perform
丢弃或从函数返回。为此,请使用 RETURN QUERY
.
您可以使用 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
$$;
但是,您可以将整个函数简化为单个查询并改用 language sql
。 return query
就不需要了。
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);
$$;
您的 plpgsql 函数应该 return query
有效。
但在这里我认为你可以通过直接查询来做你想做的,所以只需切换到 sql 和 :
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;
$$
这将选择其电子邮件作为函数参数的用户记录,然后搜索所有对应的朋友(无论是 User1ID
还是 User2ID
),最后 return 好友用户记录
我正在尝试创建一个仅 return 用户在数据库中拥有的好友的 postgres 函数。它应该只是 return 所有用户朋友的名字和姓氏。但是,我不断收到此错误:
[42601] ERROR: query has no destination for result data
这对我来说没有意义,因为我 return 正在 table 中包含所有名字和姓氏。
这是我的功能。有谁知道为什么会这样?我在别处找不到答案。
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
$$;
使用SELECT ... INTO ...
存储查询结果
或
打开游标
或
在您不关心结果集的不太可能的情况下使用 PERFORM ...
。
您的最终查询不会“使用”其结果。在 PL/pgSQL 中,查询的结果要么需要存储到变量中(就像您在第一个查询中所做的那样),要么使用 perform
丢弃或从函数返回。为此,请使用 RETURN QUERY
.
您可以使用 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
$$;
但是,您可以将整个函数简化为单个查询并改用 language sql
。 return query
就不需要了。
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);
$$;
您的 plpgsql 函数应该 return query
有效。
但在这里我认为你可以通过直接查询来做你想做的,所以只需切换到 sql 和 :
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;
$$
这将选择其电子邮件作为函数参数的用户记录,然后搜索所有对应的朋友(无论是 User1ID
还是 User2ID
),最后 return 好友用户记录