2013-06-27 97 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