oracle觸發器使用:after insert 與before insert的簡單使用注意

建立觸發器時,觸發器類型爲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
相關文章
相關標籤/搜索