建立觸發器時,觸發器類型爲after insert ,函數
在begin中事務
Select fieldA into v_a from tableA;it
執行到此句時,會出錯:io
--彈出錯誤信息提示 table
--ORA-04091:表tr_table發生了變化觸發器/函數不能讀它 擴展
--ORA-06512: 在iu_table line 2 date
--ORA-04088: 觸發器iu_table 執行過程當中出錯 數據
問題分析:異常
在Oracle中執行DML語句的時候是須要顯示進行提交操做的。當咱們進行插入的時候,會觸發觸發器執行對觸發器做用表和擴展表的種種操做,可是這個時候觸發器和插入語句是在同一個事務管理中的,所以在插入語句沒有被提交的狀況下,咱們沒法對觸發器做用表進行其餘額外的操做。若是執行其餘額外的操做則會拋出如上異常信息。tab
解決方案:
出錯的緣由是由於觸發器和DML語句在同一事務管理中,因此方案一即是將觸發器和DML語句分紅兩個單獨的事務處理。這裏可使用Pragma autonomous_transaction; 告訴Oracle觸發器是自定義事務處理。
Declare
pragma autonomous_transaction;
begin
-------
--這裏須要顯示提交事務
Commit;
End;
同時,觸發器不能更新觸發條件所在的行。
例如:
Create or replace trigger tri_A
After insert on tableA
For each row
Declare
pragma autonomous_transaction;
begin
update tableA set fieldA=1 where id=:new.id;
end;
當你插入數據時,會發現,這個update語句有執行,卻不生效。
而後想改成:new.fieldA= 1,執行後,報錯:
ORA-04084:沒法更改此觸發器類型的new值
這時候,要更換策略了,不過,也得根據我的需求了,
恰好個人需求能夠經過更新觸發器類型after insert 爲before insert