Postgresql
如何在不保持事務打開的情況下保持結果集?
以下文件描述瞭如何查看從函式返回的 refcursor,here,如下所示:
CREATE FUNCTION reffunc(refcursor) RETURNS refcursor AS ' BEGIN OPEN $1 FOR SELECT col FROM test; RETURN $1; END; ' LANGUAGE plpgsql; BEGIN; SELECT reffunc('funccursor'); FETCH ALL IN funccursor; COMMIT;
這對我有用。但是,如果我想在我的螢幕上保留結果,我必須保持交易開放。當我執行 COMMIT 時,我的結果集被丟棄。當我同時執行 FETCH 和 COMMIT 時,第一個結果集被丟棄。
有沒有辦法送出事務但保留結果集?PgAdmin 的版本是 1.18.1。
當使用DECLARE在 SQL 級別定義游標時,有一個選項
WITH HOLD
可以使其在送出目前事務後繼續存在。引用文件:WITH HOLD 指定該游標在創建它的事務成功送出後可以繼續使用
另一方面,由 plpgsql 函式打開的 refcursor 在事務結束時關閉。引用plpgsql 文件:
所有門戶在交易結束時都隱式關閉。因此,refcursor 值僅可用於引用打開的游標,直到事務結束。
要在 plpgsql 函式中創建可以在其“父”事務之外使用的游標,這只是語法問題。您需要游標的 SQL 實現,而不是 plpgsql 變體。為此,
EXECUTE
必須使用。例如,這裡有一個類似於您的函式的框架,但使用的 SQL 級游標比事務更有效:
CREATE FUNCTION dyncursor(name text) RETURNS VOID AS $$ DECLARE query text; BEGIN query='SELECT 1 as col1, 2 as col2'; -- sample query EXECUTE 'DECLARE ' || quote_ident(name) || ' CURSOR WITH HOLD FOR ' || query; END $$ language plpgsql;
展示:
測試=>開始; 測試=> 選擇 dyncursor('foo'); 動態游標 ----------- (1 行) 測試=> 送出; test=> 從 foo 中獲取所有內容; col1 | col2 ------+------ 1 | 2 (1 行) 測試=> 關閉 foo; 關閉游標