1. 程式人生 > >PLSQL總結——16.自治事務

PLSQL總結——16.自治事務

/*
  我們應該知道,當一個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的記錄。
*/