Postgresql

如何在不保持事務打開的情況下保持結果集?

  • November 11, 2013

以下文件描述瞭如何查看從函式返回的 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;
關閉游標

引用自:https://dba.stackexchange.com/questions/52968