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_;
这会导致操作失败并告诉用户为什么他们的操作被拒绝。默默地撤销用户的操作是一种不好的做法,因为它会让人迷惑,而被迷惑的用户是不开心的,而且常常是愤怒的用户。
甲骨文顶点。我想创建触发器:如果用户删除了 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_;
这会导致操作失败并告诉用户为什么他们的操作被拒绝。默默地撤销用户的操作是一种不好的做法,因为它会让人迷惑,而被迷惑的用户是不开心的,而且常常是愤怒的用户。