小菜毛毛技術分享

          與大家共同成長

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            164 Posts :: 141 Stories :: 94 Comments :: 0 Trackbacks

          在寫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

           

          posted on 2010-02-04 18:22 小菜毛毛 閱讀(6597) 評論(0)  編輯  收藏 所屬分類: 數據庫
          主站蜘蛛池模板: 张家界市| 肃宁县| 新巴尔虎右旗| 长乐市| 大竹县| 定襄县| 那曲县| 浮梁县| 中西区| 星子县| 涪陵区| 寻甸| 浦江县| 玉门市| 邯郸市| 手游| 四子王旗| 年辖:市辖区| 肇源县| 霍林郭勒市| 油尖旺区| 丁青县| 奎屯市| 都昌县| 葵青区| 罗田县| 武强县| 丰顺县| 龙井市| 博客| 德兴市| 连山| 宁国市| 察雅县| 锡林浩特市| 祥云县| 清河县| 图片| 罗定市| 杭州市| 灵武市|