Postgresql
COMMIT 是否在 PostgreSQL 9.5 中的匿名 plgpsql 函式中工作?
我正在將大量大文件導入到多個表中,這些表要使用匿名 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 個小時,我希望如果在某些時候出現導入錯誤,所有導入都不會回滾。
IIRC
COMMIT
在儲存函式中不起作用,因為整個函式被視為單個事務。程式碼塊被視為沒有參數的函式體,返回 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 塊”不在其他事務中執行。