Oracle12c:Trigger 创建时出现编译错误(table 或视图不存在)

Oracle12c:Trigger created with compilation errors(table or view does not exist)

我尝试创建一个触发器如下:

CREATE OR REPLACE TRIGGER update_student
AFTER UPDATE OF school ON student FOR EACH ROW
BEGIN
    UPDATE school SET num2=num2+1 WHERE school.id=(SELECT school FROM inserted);
END;
/

但是当我执行代码时,它显示Trigger created with compilation errors,然后我执行show errors;,它显示如下:

2/5 PL/SQL: SQL Statement ignored
2/71 PL/SQL: ORA-00942: table or view does not exist

我猜这里的table是学校的意思,但我确定table school exists.Where是问题所在?请给我一个hand.Thanks!

我修改了代码如下:

CREATE OR REPLACE TRIGGER update_student
AFTER UPDATE OF school ON student FOR EACH ROW
BEGIN
    UPDATE :new.school SET num2=num2+1 WHERE school.id=(SELECT :new.school FROM inserted);
END;
/

但新错误 occurred.It 显示:

2/5      PL/SQL: SQL Statement ignored
2/24     PL/SQL: ORA-00903: invalid table name

我该如何解决?谢谢!

在触发器中,您应该使用 :NEW 和 :OLD 伪行来访问新旧字段值。因此,您的更新语句应该是:

UPDATE school
  SET num2 = num2 + 1
  WHERE school.id = :NEW.SCHOOL;

您可能还想减少旧学校的学生人数:

UPDATE SCHOOL
  SET NUM2 = NUM2 - 1
  WHERE SCHOOL.ID = :OLD.SCHOOL;

如果 STUDENT.SCHOOL(旧版本或新版本)为 NULL,您应该避免尝试更新 SCHOOL 行:

CREATE OR REPLACE TRIGGER UPDATE_STUDENT
  AFTER UPDATE OF SCHOOL ON STUDENT
  FOR EACH ROW
BEGIN
  IF :NEW.SCHOOL IS NOT NULL THEN
    UPDATE SCHOOL
      SET NUM2 = NUM2 + 1
      WHERE SCHOOL.ID = :NEW.SCHOOL;
  END IF;

  IF :OLD.SCHOOL IS NOT NULL THEN
    UPDATE SCHOOL
      SET NUM2 = NUM2 - 1
      WHERE SCHOOL.ID = :OLD.SCHOOL;
  END IF;
END UPDATE_STUDENT;

祝你好运。