Sql Oracle中触发器语句的编译器错误
我已经编写了一个CREATE触发器,但由于某些原因,我无法使它没有编译器错误。有什么想法吗?以下是代码和错误消息:Sql Oracle中触发器语句的编译器错误,sql,oracle,triggers,compiler-errors,Sql,Oracle,Triggers,Compiler Errors,我已经编写了一个CREATE触发器,但由于某些原因,我无法使它没有编译器错误。有什么想法吗?以下是代码和错误消息: CREATE OR REPLACE TRIGGER ManagerDeleteTrigger AFTER DELETE ON employee1 REFERENCING OLD AS OldRow NEW AS NewRow FOR EACH ROW WHEN(OldRow.FK_EMPLOYEEEMPLOYEEID != NewRow.FK_EMPLOYEEEMPLOYEEID
CREATE OR REPLACE TRIGGER ManagerDeleteTrigger
AFTER DELETE ON employee1
REFERENCING
OLD AS OldRow
NEW AS NewRow
FOR EACH ROW
WHEN(OldRow.FK_EMPLOYEEEMPLOYEEID != NewRow.FK_EMPLOYEEEMPLOYEEID)
UPDATE employee1 SET FK_EMPLOYEEEMPLOYEEID = null WHERE FK_EMPLOYEEEMPLOYEEID = OldRow.employeeID;
错误消息是:
Error(1,105): PLS-00103: Encountered the symbol ";" when expecting one of the following:
( begin case declare end exception exit for goto if loop mod null pragma raise return select update while with <an identifier> <a double-quoted delimited-identifier> <a bind variable>
<< continue close current delete fetch lock insert open rollback savepoint set sql execute
commit forall merge pipe purge The symbol "exit" was substituted for ";" to continue.
然后,我想创建一个触发器,每当员工a更改其职务时,它都会查找所有以a为经理的员工,并将经理字段设置为null。这有什么意义吗?您缺少
开始。。。结束
在实际触发代码周围阻塞。请检查手册,完整的语法记录在那里
下一个错误是您无法更新正在更新的表。只需将新值指定给相关列:
另一个问题是后触发器不能更改任何值,您需要使用前触发器
最后,为什么要更改DELETE
触发器中的值?无论如何,删除后该行将消失,因此无需更改该值。您可能想使用更新触发器:
CREATE OR REPLACE TRIGGER ManagerDeleteTrigger
BEFORE UPDATE ON employee1
REFERENCING OLD AS OldRow
NEW AS NewRow
FOR EACH ROW
WHEN (OldRow.FK_EMPLOYEEEMPLOYEEID != NewRow.FK_EMPLOYEEEMPLOYEEID)
BEGIN
:NewRow.FK_EMPLOYEEEMPLOYEEID := null;
END;
/
尝试将其包装在begin和end子句中
CREATE OR REPLACE TRIGGER ManagerDeleteTrigger
AFTER DELETE ON employee1
REFERENCING
OLD AS OldRow
NEW AS NewRow
BEGIN
FOR EACH ROW
WHEN(OldRow.FK_EMPLOYEEEMPLOYEEID != NewRow.FK_EMPLOYEEEMPLOYEEID)
UPDATE employee1 SET FK_EMPLOYEEEMPLOYEEID = null WHERE FK_EMPLOYEEEMPLOYEEID = OldRow.employeeID
END ManagerDeleteTrigger;
我早就有了开头/结尾,但当我看到另一个参考资料时,我就把它去掉了。但是,这段代码不起作用,因为它仍然会出错。另外,它也没有完成我试图完成的任务,即将所有带有FK_EmployeeID=OldRow.EmployeeID的行设置为FK_EmployeeID=null。@user2756569那么您在做其他错误的事情,因为代码本身是正确的:您可能想要编辑您的问题并描述您真正的问题。在我看来,好像您只是想要一个外键约束,其更新集为null时具有。但是,如果没有对所有涉及的表进行定义,也没有对您想要实现的目标进行清晰的描述,那么这只是一个粗略的猜测。好的,我将首先澄清我的问题!编辑:刚刚更新了OPI,您的代码也出现了编译错误。错误(2,10):PLS-00103:在预期以下情况之一时遇到符号“行”:即使语法正确,触发器也不会工作。您无法更新已触发触发器的表。抱歉,但在FOR EACH ROW之后,开始向下一行。没有名字的马是正确的,不能更新记录的旧值或新值。见:
CREATE OR REPLACE TRIGGER ManagerDeleteTrigger
AFTER DELETE ON employee1
REFERENCING
OLD AS OldRow
NEW AS NewRow
BEGIN
FOR EACH ROW
WHEN(OldRow.FK_EMPLOYEEEMPLOYEEID != NewRow.FK_EMPLOYEEEMPLOYEEID)
UPDATE employee1 SET FK_EMPLOYEEEMPLOYEEID = null WHERE FK_EMPLOYEEEMPLOYEEID = OldRow.employeeID
END ManagerDeleteTrigger;