错误:无法正确创建触发器(ORA-24344:编译错误 ORA-06512 成功)。甲骨文 SQL

Posted

技术标签:

【中文标题】错误:无法正确创建触发器(ORA-24344:编译错误 ORA-06512 成功)。甲骨文 SQL【英文标题】:Error: can't create trigger properly (ORA-24344: success with compilation error ORA-06512). Oracle SQL 【发布时间】:2019-12-08 21:17:50 【问题描述】:

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

    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 错误。你能解释一下为什么以及我应该怎么做来解决它?

【问题讨论】:

发出SQL> show errors时打印什么错误? 【参考方案1】:

如果 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_;

这会使操作失败并告诉用户为什么他们的操作被拒绝。默默地撤消用户的操作是不好的做法,因为它令人迷惑,而迷惑的用户是不快乐且经常生气的用户。

【讨论】:

【参考方案2】:

在所有olds 前加上冒号:,即

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);

【讨论】:

我也不知道,因为您没有提供任何有用的信息。发生什么了?有什么错误吗?如果有,是哪一个?

以上是关于错误:无法正确创建触发器(ORA-24344:编译错误 ORA-06512 成功)。甲骨文 SQL的主要内容,如果未能解决你的问题,请参考以下文章

尝试创建一个触发器来跟踪用户对表所做的更改但不断收到错误 ORA-24344:编译错误成功

ORA-24344: 尝试在 plsql 中创建函数时编译错误成功

For循环中触发失败

函数创建时编译错误成功,为啥?

PL/SQL 甲骨文 ORA-24344

编译过程时出现oracle错误