2009-06-04 120 views
3

我想将多个查询分组到一个生活在PostgreSQL中的函数中。该函数将使用PDO进行查询。您可以使用PDO和PostgreSQL返回多个结果集吗?

功能是:

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 

这似乎表明它不被支持,但是再次,我找不到一个清楚地定义是什么的列表。

有没有人设法使此工作?

参考文献:

回答

4

支持返回多个结果仍对PostgreSQL todo list,它肯定会打不到8.4。至于setof refcursors方法,你试图做的事不起作用,因为这个函数没有返回多个行集 - 它返回一个refset的行集。我不确定是否使用refcursors客户端工作,但我不认为它可能,即使客户端 - 服务器协议支持它,PDO不太可能有API。

但是,为什么你想在一个查询中返回多个结果集?您始终可以单独进行查询。

+0

这是一个相当复杂的调度过程,因此返回多个父表和子表。有几个查询共享参数,它会在数据库上更快,另外我想将它分组以便于维护并减少往返。呃,好吧.. – 2009-06-06 13:53:29

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,但这个文件片段的存在至少可以追溯到8.1(我的版本正在运行)。正如注释所说,您需要在事务中使用游标,因为它们在每个事务结束时隐式关闭(即,如果自动提交模式打开,则在每个语句结束时)。