postgresql RETURN在返回集合的函数中不能有参数

tktrz96b  于 2022-11-29  发布在  PostgreSQL
关注(0)|答案(2)|浏览(454)

我写了一个函数,它接受一个名为id的参数,这个参数是整数。当函数被调用时,它返回特定用户的信息,即user_id,name和password。
如果特定用户不存在,函数返回表的最后一个用户。
函数为:

create function getUser(id int) 
returns table(user_id int, name varchar, password varchar)
language plpgsql as 
$$
declare
   info users%rowtype;
begin
   select
      *
   from
     users
 into 
     info
 where 
     user_id = id;
 
 if not found then
     raise warning 'such user does not exist';
     select
         * 
     from 
         users
     into
         info
     where 
         user_id = MAX(users.user_id);
 end if;
 return info;
 end;
 $$;

但结果是:

RETURN cannot have a parameter in function returning set
 LINE 27:     return info;
                ^
 HINT:  Use RETURN NEXT or RETURN QUERY.

users表由以下列和行组成:

user_id | name   | password |

我不知道我犯了什么错误。我该怎么做才能解决这个问题呢?

voj3qocg

voj3qocg1#

https://www.postgresql.org/docs/current/plpgsql-control-structures.html

*3.6.1.1.退货

带表达式的RETURN将终止函数并将表达式的值返回给调用方。此格式用于不返回集合的PL/pgSQL函数

*43.6.1.2.返回下一个并返回查询

当PL/pgSQL函数声明为return SETOF sometype时,所遵循的过程略有不同。在这种情况下,要返回的各个项由一系列RETURN NEXT或RETURN QUERY命令指定,然后使用不带参数的最后一个RETURN命令来指示函数已完成执行。RETURN NEXT可用于标量数据类型和复合数据类型;使用复合结果类型,将返回结果的整个“表”。RETURN QUERY将执行查询的结果附加到函数的结果集
您的代码:select * from users into info where user_id = id;可以返回1个以上的行,因此您应该使用return query
另一个问题是声明变量user_id与标识符user_id相同,解析器不知道如何处理它。
demo

5fjcxozz

5fjcxozz2#

您可以只声明一个数据类型为users的变量,并执行如下操作:

create function getUser(id int) 
   returns  users
language plpgsql as 
$$
declare
  info users;
begin  
 select * from users where users.user_id=id into info;
 if info is null then
     select * from users order by user_id desc limit 1 into info;
 end if;
return info;
end;
$$;

sqldaddy中的演示

相关问题