小菜毛毛技術(shù)分享

          與大家共同成長

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            164 Posts :: 141 Stories :: 94 Comments :: 0 Trackbacks

          在寫trigger的時候,經(jīng)常會遇到這種情況
          當(dāng)在程序塊中需要對trigger本表進(jìn)行修改或查詢的時候,系統(tǒng)會提示錯誤:  ORA-04091: table is mutating, trigger/function may not see it

          關(guān)于這個錯誤,其實(shí)是由于對本表的操作造成的.ORACLE DB里默認(rèn)在寫TRIGGER的時候把本表鎖死,不允許對其進(jìn)行操作,也就是說這個錯誤是不能通過系統(tǒng)的手段解決的,只能改用一些其它的SQL來繞開它.

          對此可通過自治事物解決:

          SQL> CREATE TABLE T(ID NUMBER(18),MC VARCHAR2(20),DT DATE);

          表已創(chuàng)建。

          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  /

          觸發(fā)器已創(chuàng)建

          SQL> INSERT INTO T VALUES(1,'111111',SYSDATE);

          已創(chuàng)建 1 行。

          SQL> INSERT INTO T VALUES(2,'222222',SYSDATE);

          已創(chuàng)建 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 行出現(xiàn)錯誤:
          ORA-04091: 表 TEST.T 發(fā)生了變化, 觸發(fā)器/函數(shù)不能讀它
          ORA-06512: 在 "TEST.TR_T", line 4
          ORA-04088: 觸發(fā)器 'TEST.TR_T' 執(zhí)行過程中出錯


          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  /

          觸發(fā)器已創(chuàng)建

          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 小菜毛毛 閱讀(6598) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫
          主站蜘蛛池模板: 张北县| 扶绥县| 孟津县| 仙桃市| 西吉县| 耿马| 龙里县| 定南县| 红河县| 通海县| 霍林郭勒市| 北辰区| 长沙市| 大邑县| 南江县| 中方县| 芒康县| 潮州市| 工布江达县| 石狮市| 定襄县| 子长县| 屏南县| 德令哈市| 沾益县| 瑞安市| 积石山| 周宁县| 会宁县| 凤山市| 平塘县| 伊宁县| 鄂托克前旗| 左云县| 七台河市| 惠州市| 体育| 哈尔滨市| 宜昌市| 平舆县| 上思县|