after insert or update or delete on Xftpj_Pjjl_Byq
declare
begin
--直接寫存儲過程名稱+;
end HVM_ZTPJ_BYQ;
2.觸發器的控制
alter table xftpj_pjjl_byq disable all triggers; --禁用觸發器
alter table xftpj_pjjl_byq enable all triggers; --啟用觸發器
// ***************************************************
// ********************* 收集2 *********************
觸發器傳參數給存儲過程,存儲過程中有 insert tableA where id=1....
接着 update tableA where id=1.
由於insert語句不是自動提交,所以當insert語句沒有 commit 的時候,update 會報“表/視圖發生了變化,程序不能讀它”的錯誤,也就是id=1這一行被insert鎖住了。此時,在觸發器中調用自治事務,問題得以解決。
Oracle自治事務(Autonomous Transaction)將一個主事務分割成幾個子事務,在執行完子事務以后再繼續主事務。這里的關鍵是,子事務是獨立於主事務的,子事務中的Rollback 和 Commit 操作只會影響子事務中的DML操作;同樣,主事務中的 Rollback 和 Commit 操作只會影響事務中的DML操作,而不會影響子事務中的操作。在子事務中已經commit的操作,不會被主事務中的rollback撤銷。
制定PL/SQL程序塊為自治事務可以通過在程序開頭使用如下命令實現
PRAGMA AUTONOMOUS_TRANSACTION
定義自治事務必須遵循以下規則:
1.如果要被定義為自治事務的程序是匿名的,則它必須是一個最外層的程序塊。
2.如果不是匿名的,則它必須是函數或者過程,或者是包含在一個中。在一個包中,只有其中的函數或過程能夠定義成自治事務。整個包不能申明為自治事務。
3.一個對象的方法可以申明為自治事務
4.觸發器可以申明為自治事務
5.內嵌程序塊不能申明為自治事務
注意:對於一個匿名的自治事務程序塊來說,只有這個塊的begin和end之間的代碼被看作是自治事務。
觸發器代碼如下:
1 create or replace trigger trigger_main2_update 2 before update on t_busi_main_presend2 for each row 3 declare 4 pragma autonomous_transaction; --聲明該觸發器的事務為自治事務 5 begin 6 DBMS_OUTPUT.PUT_LINE(:new.SHSTATUS); 7 if :new.SHSTATUS='1' and :old.SHSTATUS='0' then 8 p_main2_mx(:new.id,:new.smscontent,:new.allcode,:new.phonetype,:new.sjtongdaoid,:new.cjr,:new.pretongdaoid,:new.clientid,:new.shr,:new.pretime,:new.cjsj,:new.shstatus,:new.kouchucnt,:new.dxlx,:new.allcount); --調用存儲過程,並給存儲過程傳參數 9 :new.SENDSTATUS:='1' ; 10 end if; 11 commit; 12 end; 13 14
運用AT(autonomous_transaction)時,有一些注意事項,簡單列舉如下:
1. 在匿名PL/SQL塊中,只有頂級的匿名PL/SQL塊可以被設為AT
2. 如果AT試圖訪問被MT控制的資源,可能有deadlock 發生.
3. Package 不能被聲明為AT,只有 package 所擁有的 function 和 procedure 才能聲明為AT
4. AT程序必須以commit 或 rollback 結尾,否則會產生Oracle錯誤ORA-06519: active autonomous transaction detected and rolled back