我想将多个查询分组到一个存在于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
这似乎表明它不受支持,但是再一次,我找不到一个确切定义的列表。
有没有人设法让这个工作?
参考文献:
答案 0 :(得分:4)
支持返回多个结果集仍在PostgreSQL todo list上,并且肯定不会达到8.4。对于setof refcursors方法,你要做的事情不起作用,因为函数没有返回多个rowset - 它返回一个refsets的rowset。我不确定是否使用refcursors客户端工作,但我发现它不太可能,即使客户端 - 服务器协议支持它,PDO也不太可能有这样的API。
但是为什么要在一个查询中返回多个结果集?您可以随时单独执行查询。
答案 1 :(得分: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(我正在运行的版本)。正如评论所说,您需要在事务内部使用游标,因为它们在每个事务结束时被隐式关闭(即,如果启用了自动提交模式,则在每个语句的末尾)。