在 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 sqlreturn 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 好友用户记录