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');
輸出是等上截圖: 然後當我嘗試取數據我得到的錯誤:ERROR: cursor "c" does not exist
PostgreSQL不支持存儲過程,所以一次只能返回一個結果。 –
是可能的。檢查這[後](http://stackoverflow.com/questions/756689/postgresql-function-returning-multiple-result-sets)。 –
您能否詳細說明從3個表中選擇什麼,以及您希望如何返回?例如'refcursor'不是一個結果集。如果三個表中的列在數據類型上是相同的,那麼可以將查詢合併成一個,然後返回結果集。 – Patrick