【问题标题】:How to return result set from PostgreSQL stored procedure?如何从 PostgreSQL 存储过程返回结果集?
【发布时间】:2018-06-17 06:29:56
【问题描述】:

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

【问题讨论】:

  • 您需要定义存储过程返回的内容。例如,请参阅this question
  • @JoakimDanielson:这种误解可能是由于“存储过程”这一广泛的误称。 SQL 过程 不是函数。见:dba.stackexchange.com/a/194811/3684
  • @ErwinBrandstetter SQL procedures are not functions - 我不会用词不当。 Oracle 和 SQL Server 都支持从存储过程返回结果集。

标签: postgresql postgresql-11


【解决方案1】:

按照 Postgres 11 上的 docs(我的粗体强调):

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

您可以将参数标记为输出,以便它们的行为类似于变量。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    相关资源
    最近更新 更多