6

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;
$$;

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

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

4

1 回答 1

7

遵循 Postgres 11 上的文档(我的粗体强调):

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

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

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

(*) 在此处阅读有关函数波动性的更多信息。

于 2018-06-17T06:58:38.787 回答