2013-06-27 138 views
4

我有審計觸發器,用於存儲在EMP表的任何行上執行的操作。觸發器無法初始化變量

這觸發工作正常,但在某些情況下(這很少發生,而我不能確定確切的條件)它給了我

Oracle錯誤:ORA-01400:不能將NULL插入(「MY_SCHEMA」 「HIST_EMP」。「ACTION」)

CREATE OR REPLACE TRIGGER HIST_EMP_AIUD 
AFTER UPDATE OR INSERT OR DELETE 
ON EMP 
REFERENCING NEW AS NEW OLD AS OLD 
FOR EACH ROW 
DECLARE 
     v_action VARCHAR2(1) := 'D'; 
BEGIN 
     IF INSERTING THEN 
      v_action := 'A'; 
     ELSIF UPDATING THEN 
      v_action := 'U'; 
     END IF; 

     IF DELETING THEN 
     INSERT INTO hist_emp (source_rowid, source_date, action) 
        VALUES (:old.rowid, SYSDATE, v_action); 
     ELSIF INSERTING OR UPDATING THEN 
     INSERT INTO hist_emp (source_rowid, source_date, action) 
        VALUES (:new.rowid, SYSDATE, v_action); 
     END IF; 
EXCEPTION 
    WHEN OTHERS THEN 
     --Code to Log 
     -- <some exception handling should be placed here > 

END; 

這當我刪除的行,但我不知道發生了一般。 任何想到爲什麼會發生這種情況?該代碼看起來不錯,我...

+0

哇,這很奇怪。代碼看起來不錯。 「其他」條款中是否存在任何代碼?但願如此。你可以展示它嗎? – OldProgrammer

+0

'hist_emp'上是否有觸發器? –

+0

'hist_emp'上沒有觸發器。在OTHERS部分有一個最終在exception_logging表中插入的泛型過程調用。 –

回答

1

奇怪的事情是怎麼回事變量初始化v_action,我猜。嘗試處理所有3種可能性:

 v_action:= null; 
     IF INSERTING THEN 
      v_action := 'A'; 
     ELSIF UPDATING THEN 
      v_action := 'U'; 
     ELSIF DELETING THEN 
      v_action := 'D'; 
     END IF; 
+0

@Aditya,是的,默認v_action VARCHAR2(1):='D'在某些情況下不起作用。嘗試大衛建議...... – pahariayogi