通常聽到這功能的用途,是有一些作業,需要避免會被當前作業的成敗所影響,最常見的就是額外的 Log 紀錄。
這種功能在 PostgreSQL 裡面其實一直都從缺(可能是因為 PGSQL 社群上開發的人都偏好扁平式的系統設計&規劃?),但是在一些習慣 Oracle 的用戶來說,已經有一些既定的規範,非得使用這種功能才行。
之前已經有一次筆記,演練這個功能的 Workaround 手法,不過現在(2018 年 8 月),下一版的 EDB Postgres 企業版 v11 總算補上了這個「Oracle 相容」功能~
edb=# CREATE TABLE test ( id NUMBER NOT NULL, description VARCHAR2(50) NOT NULL ); CREATE TABLE edb=#
然後,套用上面這篇的 Oracle 範例:這邊唯一的小小差別,就是 EDB / PGSQL 的操作指令 psql 預設的是交易模式是 Autocommit,在 Oracle 的 SQL*Plus 預設需要執行 Commit 才行~故這邊使用 begin ... commit/rollback 來具體弄成一個交易。
edb=# begin; BEGIN edb=# INSERT INTO test (id, description) VALUES (1, 'Description for 1'); INSERT 0 1 edb=# INSERT INTO test (id, description) VALUES (2, 'Description for 2'); INSERT 0 1 edb=# DECLARE edb-# PRAGMA AUTONOMOUS_TRANSACTION; edb$# BEGIN edb$# FOR i IN 3 .. 10 LOOP edb$# INSERT INTO test (id, description) edb$# VALUES (i, 'Description for ' || i); edb$# END LOOP; edb$# COMMIT; edb$# END; EDB-SPL Procedure successfully completed edb=# SELECT * FROM test; id | description ----+-------------------- 1 | Description for 1 2 | Description for 2 3 | Description for 3 4 | Description for 4 5 | Description for 5 6 | Description for 6 7 | Description for 7 8 | Description for 8 9 | Description for 9 10 | Description for 10 (10 rows) edb=# ROLLBACK; ROLLBACK edb=# SELECT * FROM test; id | description ----+-------------------- 3 | Description for 3 4 | Description for 4 5 | Description for 5 6 | Description for 6 7 | Description for 7 8 | Description for 8 9 | Description for 9 10 | Description for 10 (8 rows) edb=#
上面可見,透過 AUTONOMOUS_TRANSACTION 所塞的資料,並沒有因為這邊的 Rollback 而被取消。而當前交易所塞進去的前兩筆資料,則因為 Rollback 而取消了。
另外,這邊可以看到,此處使用的是 Oracle 相容語法,並不是用在 PGSQL 原生的 Function 或是 PGSQL 11 將引進能處理交易的 Procedure 功能,但是看到 Procedure 功能導入,就可以猜測,後續原生的 PGSQL 語法也應該會支援了。
這篇是使用 EDB 公司在八月初發行的 Beta 測試版進行練習的,不過通常 PGSQL 的軟體到了 Beta 階段,功能上就已經固定下來了,主要都是在除錯而已~所以這篇叫做偷跑篇(同時也是一則流水帳、拖杳篇)~~
當然,EDB 11 不會只有這個改進而已(也會包含 PGSQL 11 新增改進),等到正式出來,再來看看要挑什麼來練習吧~
參考資料
ORACLE-BASE - Autonomous Transactions
PL/SQL Language Elements - AUTONOMOUS_TRANSACTION Pragma
EPASv11 release notes
PostgreSQL 11 - Server-side Procedures (Part 1) | 2ndQuadrant Blog
Tech preview: PostgreSQL 11 - CREATE PROCEDURE - Cybertec
PostgreSQL 11 : Procedures are coming - Blog dbi services
PostgreSQL 11 New Features With Examples (Beta 1) - Noriyoshi Shinoda ( HPE Japan Co, Ltd. )
沒有留言:
張貼留言