如何从 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。
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。