在寫trigger的時候,經常會遇到這種情況
當在程序塊中需要對trigger本表進行修改或查詢的時候,系統會提示錯誤: ORA-04091: table is mutating, trigger/function may not see it
關于這個錯誤,其實是由于對本表的操作造成的.ORACLE DB里默認在寫TRIGGER的時候把本表鎖死,不允許對其進行操作,也就是說這個錯誤是不能通過系統的手段解決的,只能改用一些其它的SQL來繞開它.
對此可通過自治事物解決:
SQL> CREATE TABLE T(ID NUMBER(18),MC VARCHAR2(20),DT DATE);
表已創建。
SQL> CREATE OR REPLACE TRIGGER TR_T
2 AFTER DELETE ON T
3 FOR EACH ROW
4 DECLARE V_COUNT NUMBER;
5 --PRAGMA AUTONOMOUS_TRANSACTION;
6 BEGIN
7 INSERT INTO T VALUES(:OLD.ID,:OLD.MC,SYSDATE);
8 COMMIT;
9 END TR_DEL_CABLE;
10 /
觸發器已創建
SQL> INSERT INTO T VALUES(1,'111111',SYSDATE);
已創建 1 行。
SQL> INSERT INTO T VALUES(2,'222222',SYSDATE);
已創建 1 行。
SQL> COMMIT;
提交完成。
SQL> SELECT ID,MC,TO_CHAR(DT,'YYYYMMDD HH24:MI:SS') FROM T;
ID MC TO_CHAR(DT,'YYYYM
---------- -------------------- -----------------
1 111111 20080802 11:07:36
2 222222 20080802 11:07:43
SQL> DELETE FROM T WHERE ID=1;
DELETE FROM T WHERE ID=1
*
第 1 行出現錯誤:
ORA-04091: 表 TEST.T 發生了變化, 觸發器/函數不能讀它
ORA-06512: 在 "TEST.TR_T", line 4
ORA-04088: 觸發器 'TEST.TR_T' 執行過程中出錯
SQL> SELECT ID,MC,TO_CHAR(DT,'YYYYMMDD HH24:MI:SS') FROM T;
ID MC TO_CHAR(DT,'YYYYM
---------- -------------------- -----------------
1 111111 20080802 11:07:36
2 222222 20080802 11:07:43
SQL> CREATE OR REPLACE TRIGGER TR_T
2 AFTER DELETE ON T
3 FOR EACH ROW
4 DECLARE V_COUNT NUMBER;
5 PRAGMA AUTONOMOUS_TRANSACTION;--開啟自治事物
6 BEGIN
7 INSERT INTO T VALUES(:OLD.ID,:OLD.MC,SYSDATE);
8 COMMIT;--提交自治事物
9 END TR_DEL_CABLE;
10 /
觸發器已創建
SQL> DELETE FROM T WHERE ID=1;
已刪除 1 行。
SQL> COMMIT;
提交完成。
SQL> SELECT ID,MC,TO_CHAR(DT,'YYYYMMDD HH24:MI:SS') FROM T;
ID MC TO_CHAR(DT,'YYYYM
---------- -------------------- -----------------
2 222222 20080802 11:07:43
1 111111 20080802 11:08:32