1. 程式人生 > >解決觸發器檢測到活動的獨立的事務處理, 已經回退、表發生了變化, 觸發器/函式不能讀它

解決觸發器檢測到活動的獨立的事務處理, 已經回退、表發生了變化, 觸發器/函式不能讀它

   今天在寫一個觸發器的時候遇到一個問題,因為要用到新插入表中的資料進行查詢,所以就遇到了一個問題:

解決辦法是在DECLARE中加上一句話:PRAGMA AUTONOMOUS_TRANSACTION

但是這樣又會遇到一個問題:

解決辦法是在DML語句後面加上COMMIT

附上語句如下:

CREATE OR REPLACE TRIGGER "TR_CMS_MEMBERINFO"
AFTER INSERT OR UPDATE ON MEMBERNAME
FOR EACH ROW
  DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
  ROWCOUNT INTEGER;
  CLTPARENTNO VARCHAR2(30);
  BEGIN
    SELECT COUNT(*) INTO ROWCOUNT FROM MEMBERNAME WHERE CLTNO = :NEW.CLTNO;
    IF ROWCOUNT > 0 THEN
      BEGIN
        BEGIN
          SELECT CLTNO INTO CLTPARENTNO FROM MEMBERNAME WHERE ID = :NEW.PARENT_ID;


          EXCEPTION WHEN NO_DATA_FOUND THEN
            CLTPARENTNO := NULL;
        END;
        UPDATE ZKNMEMBER SET PARENTNO = CLTPARENTNO,LASTUPDATETIME = SYSDATE WHERE CLTNO = :NEW.CLTNO;
       COMMIT;
      END;
    ELSE
      BEGIN
        BEGIN
          SELECT CLTNO INTO CLTPARENTNO FROM MEMBERNAME WHERE ID = :NEW.PARENT_ID;

          EXCEPTION WHEN NO_DATA_FOUND THEN
            CLTPARENTNO := NULL;
        END;
        INSERT INTO ZKNMEMBER (CLTNO,PARENTNO,FEEMETHOD,FEEDIR1,FEEDIR2,CREATETIME,LASTUPDATETIME) VALUES (:NEW.CLTNO,CLTPARENTNO,1,1,1,SYSDATE,SYSDATE);
       COMMIT;
      END;
      END IF;
    END;