Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle中触发器语句的编译器错误_Sql_Oracle_Triggers_Compiler Errors - Fatal编程技术网

Sql Oracle中触发器语句的编译器错误

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触发器,但由于某些原因,我无法使它没有编译器错误。有什么想法吗?以下是代码和错误消息:

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;