Php 可以使用PDO和PostgreSQL返回多个结果集吗?

Php 可以使用PDO和PostgreSQL返回多个结果集吗?,php,postgresql,pdo,Php,Postgresql,Pdo,我想将多个查询分组到PostgreSQL中的单个函数中。将使用PDO查询该函数 功能是: CREATE OR REPLACE FUNCTION "test_multipe_refcursor"() RETURNS SETOF refcursor AS $BODY$ DECLARE parentRC refcursor; childRC refcursor; BEGIN open parentRC FOR SELECT * FROM parent; RETURN NEXT

我想将多个查询分组到PostgreSQL中的单个函数中。将使用PDO查询该函数

功能是:

CREATE OR REPLACE FUNCTION "test_multipe_refcursor"() 
RETURNS SETOF refcursor AS $BODY$

DECLARE
    parentRC refcursor;
    childRC refcursor;

BEGIN

open parentRC FOR
SELECT * FROM parent;
RETURN NEXT parentRC;

open childRC FOR
SELECT * FROM child;
RETURN NEXT childRC;

RETURN;

END;$BODY$
LANGUAGE 'plpgsql' VOLATILE;

ALTER FUNCTION "test_multipe_refcursor"() OWNER TO postgres;
下面是PHP代码。“数据库”作为一个单例类,它设置了常用的连接属性,没有什么特别的

  $database = Database::load();
  $sql = "select * from test_multipe_refcursor();";
  $p = $database->query($sql);

  $i = 1;
  do
  {
     $this->set('set' . $i, $p->fetchAll(PDO::FETCH_ASSOC));
     $i++;
  } while ($p->nextRowset());

  $p->closeCursor();
结果呢

 PDOException: SQLSTATE[IM001]: Driver does not support this function: driver does not support multiple rowsets in xxxx.php on line 32
这似乎表明它不受支持,但再一次,我找不到一个列表来精确定义它是什么

有人设法让它工作了吗

参考资料:


对返回多个结果集的支持仍然在上,并且肯定不会达到8.4。至于setof refcursors方法,您尝试执行的操作不起作用,因为该函数没有返回多个行集,而是返回一个refcursors行集。我不确定使用refcursors客户端是否有效,但我觉得不太可能,即使客户机-服务器协议支持它,PDO也不太可能为此提供API

但是为什么要在一个查询中返回多个结果集呢?您始终可以单独执行查询。

在的底部,有一节介绍如何从函数传回一个或多个游标。基本上,您可以让调用者将光标的名称指定为参数:

CREATE FUNCTION myfunc(refcursor, refcursor) RETURNS SETOF refcursor AS $$
BEGIN
    OPEN $1 FOR SELECT * FROM table_1;
    RETURN NEXT $1;
    OPEN $2 FOR SELECT * FROM table_2;
    RETURN NEXT $2;
END;
$$ LANGUAGE plpgsql;

-- need to be in a transaction to use cursors.
BEGIN;

SELECT * FROM myfunc('a', 'b');

FETCH ALL FROM a;
FETCH ALL FROM b;
COMMIT;

该页面是针对PostgreSQL 8.4的,但此文档片段至少早在8.1(我正在运行的版本)时就存在了。正如注释所述,您需要在事务内部使用游标,因为它们在每个事务结束时(即,如果启用自动提交模式,则在每个语句结束时)都会隐式关闭。

这是一个相当复杂的调度过程,因此会返回多个父表和子表。有几个查询共享参数,而且在数据库上会更快,另外,为了便于维护和减少往返,我希望将其分组。啊,好吧。。