UPDATE: See 这个优秀的教程 http://www.sqlines.com/postgresql/how-to/return_result_set_from_stored_procedure有关如何获取和管理引用游标的说明。
由于 node-postgres 无法识别您作为结果集句柄返回的引用游标,因此它似乎不支持来自 PostgreSQL 的多个结果集。这很公平,因为 PostgreSQL 也不真正支持多个结果集,它们只是用引用游标来模拟。
You can FETCH
from a refcursor
通过 SQL 级游标命令SQL 级游标命令 http://www.postgresql.org/docs/9.1/static/sql-fetch.html,尽管它的文档很糟糕。你不需要使用PL/PgSQL http://www.postgresql.org/docs/current/static/plpgsql-cursors.html光标处理来做到这一点。只是:
FETCH ALL FROM "<unnamed portal 1>";
请注意双引号,这很重要。将从函数返回的引用游标名称替换为<unnamed portal 1>
.
另请注意,除非创建了游标,否则创建引用游标的事务必须仍处于打开状态WITH HOLD
. Non-HOLD
当事务提交或回滚时游标关闭。
例如,给定虚拟 refcursor 返回函数:
CREATE OR REPLACE FUNCTION dummy_cursor_returning_fn() RETURNS SETOF refcursor AS $$
DECLARE
curs1 refcursor;
curs2 refcursor;
BEGIN
OPEN curs1 FOR SELECT generate_series(1,4);
OPEN curs2 FOR SELECT generate_series(5,8);
RETURN NEXT curs1;
RETURN NEXT curs2;
RETURN;
END;
$$ LANGUAGE 'plpgsql';
...它返回一组游标,您可以通过将门户名称传递给来获取结果FETCH
, eg:
regress=# BEGIN;
BEGIN
regress=# SELECT dummy_cursor_returning_fn();
dummy_cursor_returning_fn
---------------------------
<unnamed portal 7>
<unnamed portal 8>
(2 rows)
regress=# FETCH ALL FROM "<unnamed portal 7>";
generate_series
-----------------
1
2
3
4
(4 rows)
regress=# FETCH ALL FROM "<unnamed portal 8>";
generate_series
-----------------
5
6
7
8
(4 rows)
regress=#