【问题标题】:Can you return multiple result sets using PDO and PostgreSQL?您可以使用 PDO 和 PostgreSQL 返回多个结果集吗?
【发布时间】:2010-10-31 09:35:11
【问题描述】:

我想将多个查询组合成一个存在于 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

这似乎表明它不受支持,但话又说回来,我找不到确切定义什么的列表。

有没有人设法让这个工作?

参考文献:

【问题讨论】:

    标签: php postgresql pdo


    【解决方案1】:

    this PostgreSQL doc page 的底部附近,有一节描述了如何从函数中传回一个或多个游标。基本上,您让调用者指定游标的名称作为参数:

    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,但此文档 sn-p 至少可以追溯到 8.1(我正在运行的版本)。正如评论所说,您需要在事务内部才能使用游标,因为它们在每个事务结束时隐式关闭(即,如果启用自动提交模式,则在每个语句的末尾)。

    【讨论】:

      【解决方案2】:

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

      但是你为什么要在一个查询中返回多个结果集呢?您可以随时单独进行查询。

      【讨论】:

      • 这是一个相当复杂的调度过程,结果返回了几个父子表。几个查询共享参数,它在数据库上会更快,另外我想将它分组以便于维护并减少往返。嗯嗯..
      猜你喜欢
      • 2010-10-19
      • 2013-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2013-08-04
      • 2012-03-17
      • 1970-01-01
      相关资源
      最近更新 更多