2009-06-04 53 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(我的版本正在運行)。正如註釋所說,您需要在事務中使用遊標,因爲它們在每個事務結束時隱式關閉(即,如果自動提交模式打開,則在每個語句結束時)。