金倉資料庫KingbaseES PLSQL 支援語句級回滾

arthemis發表於2023-03-31

KingbaseES預設如果在PLSQL-block 執行過程中的任何SQL 語句導致錯誤,都會導致該事務的所有語句都被回滾,而Oracle 則是語句級的回滾。KingbaseES 為了更好的與 Oracle相容,新增引數ora_statement_level_rollback 。當 ora_statement_level_rollback 為 on時,表示啟用了語句級的回滾。

1、Oracle 與 KingbaseES 的差異

Oracle :在遇到 exception 時,只有觸發異常的操作被回滾。

SQL> create table t(id integer);
Table created.
SQL> begin  2    insert into t values(123);  3    insert into t values('a');  4  exception  5    when others then  6      commit;  7  end;  8  /
PL/SQL procedure successfully completed.
SQL> select * from t;
        ID
----------       123

KingbaseES : 未啟用語句級回滾。

test=# create table t(id integer);CREATE TABLEtest=# begintest-#   insert into t values(123);test-#   insert into t values('a');test-# exceptiontest-#   when others thentest-#     commit;test-# end;test-# /ANONYMOUS BLOCKtest=# select * from t;                                                                                                     
 id----(0 rows)


2、啟用語句級回滾

設定語句級回滾後,其行為與oracle 一致。

test=# set ora_statement_level_rollback=on;SETtest=# begintest-#   insert into t values(123);test-#   insert into t values('a');test-# exceptiontest-#   when others thentest-#     commit;test-# end;test-# /ANONYMOUS BLOCKtest=# select * from t;
 id -----
 123(1 row)

注意,PLSQL 的語句級回滾只發生在異常被正確捕獲的場景下才有效,如果exception 沒有被捕獲或沒有捕獲exception,則還是整個事務回滾。如以下例子:

test=# set ora_statement_level_rollback=on;test=# delete from t;DELETE 1test=# begintest-#   insert into t values(123);test-#   insert into t values('a');test-# exceptiontest-#   when no_data_found thentest-#     commit;test-# end;test-# /ERROR:  invalid input syntax for type integer: "a"LINE 1: insert into t values('a')QUERY:  insert into t values('a')CONTEXT:  PL/SQL function inline_code_block line 3 at SQL statementtest=# select * from t;
 id----(0 rows)



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70004805/viewspace-2942993/,如需轉載,請註明出處,否則將追究法律責任。

相關文章