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

How to return result set from PostgreSQL stored procedure?

PostgreSQL 从版本 11 开始支持存储过程(不是函数)。我创建了这样一个存储过程:

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

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

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.

所以问题是,存储过程如何 return 在 PostgreSQL 11+ 中设置其结果?

在 Postgres 11 上的 docs 之后(粗体强调我的):

A procedure does not have a return value. A procedure can therefore end without a RETURN statement. If a RETURN statement is desired to exit the code early, then NULL must be returned. Returning any other value will result in an error.

不过您可以将参数标记为输出,这样它们的行为就像变量一样。

附带说明一下,其他 DBMS 中通常有一个区别,即函数只能调用 SELECT 语句并且不应修改数据,而过程应处理数据操作和数据定义语言(DML、DDL)。这得出结论(在我看来)创建一个过程来简单地执行稳定的 (*) select 语句不是所需的技术。

(*) 阅读更多关于函数波动性的信息 here