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;
祝你好运。
我尝试创建一个触发器如下:
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;
祝你好运。