Error: can't create trigger properly (ORA-24344: success with compilation error ORA-06512). Oracle SQL

Error: can't create trigger properly (ORA-24344: success with compilation error ORA-06512). Oracle SQL

甲骨文顶点。我想创建触发器:如果用户删除了 ENDDATE 为 null 的行,则该行不会被删除。这是我的脚本:

    CREATE OR REPLACE  TRIGGER CHECK_NOT_NULL_
    BEFORE DELETE ON CAREER
    FOR EACH ROW
BEGIN
    IF(OLD.ENDDATE IS NULL) 
        INSERT INTO CAREER VALUES (OLD.JOBNO, OLD.EMPNO, OLD.STARTDATE, OLD.ENDDATE);
    END IF;
END CHECK_NOT_NULL_;

但是我有 ORA-24344 错误。您能解释一下为什么以及我应该如何解决它吗?

在所有 old 前面加上冒号 :,即

CREATE OR REPLACE  TRIGGER CHECK_NOT_NULL_
    BEFORE DELETE ON CAREER
    FOR EACH ROW
BEGIN
    IF(:OLD.ENDDATE IS NULL) 
        INSERT INTO CAREER VALUES (:OLD.JOBNO, :OLD.EMPNO, :OLD.STARTDATE, :OLD.ENDDATE);
    END IF;
END CHECK_NOT_NULL_;

此外,我建议您为要插入的所有列命名,例如

insert into career (jobno, empno, startdate, enddate)
  values (:old.jobno, :old.empno, :old.startdate, :old.enddate);

如果 END_DATE 为空,您的触发器将尝试重新插入该行。这行不通(您将得到 the notorious mutating table error)。但不管怎样,如果你想防止删除行,那么简单地这样做会更简单、更清楚:

CREATE OR REPLACE  TRIGGER CHECK_NOT_NULL_
    BEFORE DELETE ON CAREER
    FOR EACH ROW
BEGIN
    IF :OLD.ENDDATE IS NULL THEN 
       raise_application_error(-20000, 'Cannot delete a row when ENDDATE is null');
    END IF;
END CHECK_NOT_NULL_;

这会导致操作失败并告诉用户为什么他们的操作被拒绝。默默地撤销用户的操作是一种不好的做法,因为它会让人迷惑,而被迷惑的用户是不开心的,而且常常是愤怒的用户。