2016-11-24 7 views
-2

я пытаюсь создать триггер следующим образом:Oracle12c: Триггер создается с ошибками компиляции (таблица или представление не существует)

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 

Я думаю таблицу здесь означает школу, но я уверен, что таблица 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 

Как я могу это исправить Спасибо!

+0

Что это? '(SELECT school FROM вставлен)' - похоже, может быть, синтаксис SQL Server? Не будет работать в Oracle. Используйте ': new.school' вместо –

+0

@TonyAndrews Спасибо! Но возникла новая проблема. Я добавил его к вопросу. Можете ли вы мне помочь? Большое вам спасибо! – dapao

ответ

0

В триггере вы должны использовать псевдо-строки NEW и OLD для доступа к новым и старым значениям полей. Таким образом, ваше UPDATE заявление должно быть:

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

Вы также можете уменьшать количество студентов в старой школе:

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

И вы, вероятно, следует избегать попыток обновить строку SCHOOL, если STUDENT.SCHOOL (либо старые, либо новые версии) имеют значение NULL:

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; 

Удачи.

+0

Спасибо за помощь! Мне жаль, что моя небрежность привела к проблеме – dapao