2015-11-03 46 views
1

我有一箇舊的MSSQL過程需要移植到PostgreSQL函數。基本上,SQL過程由select語句中的CURSOR組成。對於每個遊標實體,我有三個基於當前遊標輸出的選擇語句。PostgreSQl函數返回多個動態結果集

FETCH NEXT FROM @cursor INTO @entityId 
WHILE @@FETCH_STATUS = 0 
BEGIN 
SELECT * FROM table1 WHERE col1 = @entityId 
SELECT * FROM table2 WHERE col2 = @entityId 
SELECT * FROM table3 WHERE col3 = @entityId 
END 

SELECT語句中的表具有不同的列。

我知道PostgreSQL使用refcursor爲了返回多個結果集,但問題是如果可以打開並返回循環內的多個動態refcursors?

Npgsql .NET數據提供程序用於處理結果。

Postgres的測試代碼,只有1內循環光標:

CREATE OR REPLACE FUNCTION "TestCursor"(refcursor) 
RETURNS SETOF refcursor AS 
$BODY$ 

DECLARE 
    entity_id integer; 
BEGIN 

    FOR entity_id IN SELECT "FolderID" from "Folder" 
    LOOP 
     OPEN $1 FOR SELECT * FROM "FolderInfo" WHERE "FolderID" = entity_id; 
     RETURN NEXT $1; 
     CLOSE $1; 
    END LOOP; 
END; 

$BODY$ 
LANGUAGE 'plpgsql' VOLATILE; 

然後測試代碼:

BEGIN; 
SELECT * FROM "TestCursor"('c'); 
FETCH ALL IN c; 
COMMIT; 

SELECT * FROM "TestCursor"('c');輸出是等上截圖:enter image description here 然後當我嘗試取數據我得到的錯誤:ERROR: cursor "c" does not exist

+0

PostgreSQL不支持存儲過程,所以一次只能返回一個結果。 –

+5

是可能的。檢查這[後](http://stackoverflow.com/questions/756689/postgresql-function-returning-multiple-result-sets)。 –

+0

您能否詳細說明從3個表中選擇什麼,以及您希望如何返回?例如'refcursor'不是一個結果集。如果三個表中的列在數據類型上是相同的,那麼可以將查詢合併成一個,然後返回結果集。 – Patrick

回答

0

Y你可以通過SETOF refcursor來模擬它。但這不是個好主意。這個T-SQL模式在Postgres中不被很好的支持,並且在可能的時候應該被禁止。 PostgreSQL支持函數 - 函數可以返回標量,向量或關係。就這些。通常可以重寫90%的T-SQL過程來清理PostgreSQL函數。