Php 可以使用PDO和PostgreSQL返回多个结果集吗?
我想将多个查询分组到PostgreSQL中的单个函数中。将使用PDO查询该函数 功能是: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
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
这似乎表明它不受支持,但再一次,我找不到一个列表来精确定义它是什么
有人设法让它工作了吗
参考资料:
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(我正在运行的版本)时就存在了。正如注释所述,您需要在事务内部使用游标,因为它们在每个事务结束时(即,如果启用自动提交模式,则在每个语句结束时)都会隐式关闭。这是一个相当复杂的调度过程,因此会返回多个父表和子表。有几个查询共享参数,而且在数据库上会更快,另外,为了便于维护和减少往返,我希望将其分组。啊,好吧。。