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

时间:2018-06-17 06:29:57

标签: postgresql postgresql-11

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 +中返回其结果集?

1 个答案:

答案 0 :(得分:1)

关注Postgres 11上的 docs (大胆强调我的):

  

程序没有返回值。因此,过程可以在没有RETURN语句的情况下结束。如果希望RETURN语句提前退出代码,则必须返回NULL。返回任何其他值将导致错误。

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

另一方面,通常在其他DBMS中区别于函数只能调用SELECT语句,并且在程序应该处理数据操作和数据定义语言(DML,DDL)时不应修改数据。这总结(在我看来)创建一个简单执行稳定的(*) select语句的过程并不是理想的技术。

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