Postgresql

COMMIT 是否在 PostgreSQL 9.5 中的匿名 plgpsql 函式中工作?

  • April 25, 2019

我正在將大量大文件導入到多個表中,這些表要使用匿名 plpgsql 程式碼塊中的循環進行分區$do$

$do$
BEGIN
   FOR yyyy in 2012..2016 THEN 
       EXECUTE $$COPY table$$||yyyy||$$ FROM 'E:\data\file$$||yyyy||$$.csv DELIMITER ',' CSV;$$;
   END LOOP;
END;
$do$ LANGUAGE plpgsql

整個過程大約需要 15 個小時,我希望如果在某些時候出現導入錯誤,所有導入都不會回滾。

IIRCCOMMIT在儲存函式中不起作用,因為整個函式被視為單個事務。

文件中$do$

程式碼塊被視為沒有參數的函式體,返回 void。它被解析並執行一次。

我假設這意味著整個$do$事務是一個事務,因此塊內的送出將不起作用。我對麼?

不,

您無法控制plpgsql函式(或匿名塊)內的事務。

您可以在塊外創建交易的唯一選擇,例如:

BEGIN;

DO $$
 -- function stuff

 -- but if you use a exception, you will force a rollback
 RAISE EXCEPTION 'message';
$$ LANGUAGE 'plpgsql';

COMMIT; -- OR ROLLBACK

順便說一句,DO BLOCKS與返回的函式具有相同的效果void

請在文件中查看更多資訊:

在“DO”塊(或函式)(對於低於 11 的 Postgresql 版本)內送出的唯一解決方案是使用 dblink 連接到同一伺服器並在那裡執行您的查詢。請記住變數和臨時對象的可見性。

有關 dblink 的更多資訊 從“DO”塊內部的 Postgresql-11 事務控制開始可用,而“DO 塊”不在其他事務中執行。

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