PLSQL總結——16.自治事務
阿新 • • 發佈:2019-01-01
/* 我們應該知道,當一個PL/SQL塊中出現異常時,Oracle資料庫不會回滾這個塊中的DML語句的修改。 這時候我們需要手動rollback 在寫程式碼的時候,我們不會在被呼叫的過程寫commit。因為一般環境下,外部發生異常,我們都希望進行回滾資料。 假如被呼叫的過程寫了commit,內部的DML就不會回滾,而且還影響到外部的DML。 */ --1.建立表 create table tb_error ( id number, error_msg varchar2(20) ); --2.建立過程 create or replace procedure auto_transaction is --pragma autonomous_transaction; begin insert into tb_error values (2,'test error!'); commit; end; --3.呼叫過程 declare a number; begin insert into tb_error values(1,'test'); auto_transaction; a := 'a'; dbms_output.put_line(a); exception when others then rollback;--希望把 insert into tb_error values(1,'test')回滾。而auto_transaction的DML儲存。 end; /* 這時,我們執行程式碼3的時候,發現tb_error存在insert into tb_error values(1,'test')這條記錄。當然id為2的也插進來了 這並不是我的目的。 因為auto_transaction影響了外部的事物。所以為了把他獨立開來,我們必須使用自治事物。 把程式碼2的pragma autonomous_transaction註釋去掉重新編譯,再執行程式碼3。我們發現實現了目的。 tb_error只有id為2的記錄。 */