如何从PostgreSQL存储过程返回结果集?

lp0sw83n  于 2023-03-01  发布在  PostgreSQL
关注(0)|答案(2)|浏览(696)

PostgreSQL从版本11开始支持存储过程(not function)。我创建了一个存储过程,如下所示:

CREATE OR REPLACE PROCEDURE get_user_list ()
  LANGUAGE SQL
  SECURITY DEFINER
  AS $$
  SELECT "id",
         "username",
         "display_name"
  FROM "user"
  ORDER BY "created_at" ASC;
$$;

但是当我试图执行这个存储过程时,它没有返回任何数据:

postgres=# CALL get_user_list();
CALL
postgres=# SELECT * FROM get_user_list();
ERROR:  get_user_list() is a procedure
LINE 1: SELECT * FROM get_user_list();
                      ^
HINT:  To call a procedure, use CALL.

所以问题是,存储过程如何在PostgreSQL 11+中返回其结果集?

tcomlyy6

tcomlyy61#

遵循Postgres 11上的docs(粗体强调是我的):
过程没有返回值。因此,过程可以在没有RETURN语句的情况下结束。如果需要RETURN语句提前退出代码,则必须返回NULL。返回任何其他值将导致错误。
不过,您可以将参数标记为输出,这样它们的行为就像变量一样。
另一方面,在其他DBMS中通常有一个区别,即函数只能调用SELECT语句,并且不应该修改数据,而过程应该处理数据操作和数据定义语言(DML、DDL)。由此得出结论(在我看来),创建一个过程来简单地执行稳定的 )* select语句并不是理想的技术。
(*)了解更多关于函数易变性here的信息。

06odsfpq

06odsfpq2#

如果您在过程中有一个选择以获取结果集,则可以创建如下视图:

CREATE OR REPLACE VIEW as get_user_list
  SELECT "id",
         "username",
         "display_name"
  FROM "user"
  ORDER BY "created_at" ASC;

然后select * from get_user_list以得到结果集。

相关问题