错误:无法正确创建触发器(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】:在所有old
s 前加上冒号:
,即
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:编译错误成功