2013-12-19 2 views
0

я создал 3 таблицы:Как создать триггер в Oracle с этими требованиями

  • student стола с колоннами sid, sname и dept
  • mca таблицей со столбцами sid и sname
  • mba таблицей с колонны sid и sname

Теперь я хочу, чтобы создать триггер, так что, когда значение dept является mca того sid и sname также иду в mca таблицы, и если это mba то они идут в mba таблицы.

Это то, что я пытался, based on a previous answer:

CREATE OR REPLACE TRIGGER MY_TRIGG 
AFTER INSERT ON STUDENTS 
BEGIN 
IF STUDENTS.DPTID=101 THEN 
INSERT INTO MCA VALUES(:NEW.SID,:NEW.SNAME); 
ELSIF STUDENTS.DPTID=102 THEN 
INSERT INTO MCA VALUES(:NEW.SID,:NEW.SNAME); 
ELSE 
DBMS_OUTPUT.PUT_LINE('NO DEPARTMENT IS FOUND'); 
END; 

Это показывает ошибку: НОВЫЕ ИЛИ СТАРЫЕ ССЫЛКИ НЕ РАЗРЕШЕНЫ В ТАБЛИЦЫ УРОВНЯ ТРИГГЕРЫ

ответ

0

У вас есть триггер заявление на уровне, но вы, кажется, для запуска триггера уровня, поэтому вам нужен for each row clause. Ваши DPTID ссылки должны быть также против текущей строки, от :NEW, а не STUDENTS:

CREATE OR REPLACE TRIGGER MY_TRIGG 
AFTER INSERT ON STUDENTS 
FOR EACH ROW 
BEGIN 
    IF :NEW.DPTID=101 THEN 
    INSERT INTO MCA (SID, SNAME) VALUES (:NEW.SID,:NEW.SNAME); 
    ELSIF :NEW.DPTID=102 THEN 
    INSERT INTO MBA (SID, SNAME) VALUES (:NEW.SID,:NEW.SNAME); 
    ELSE 
    DBMS_OUTPUT.PUT_LINE('NO DEPARTMENT IS FOUND'); 
    END IF; 
END; 

я тоже добавил недостающую END IF. Возможно, вы захотите рассмотреть заявление CASE, а не IF/ELSIF/ELSE. И вы должны явно указать имена столбцов как часть своих операторов INSERT.

Имея DBMS_OUTPUT звонок в триггере не очень полезен, так как вы не можете предположить, что тот, кто делает вставку, увидит его. Чаще всего возникает исключение, если некоторые критерии не выполняются, и это также предотвратит вставку в главную таблицу.

Смежные вопросы