2016-02-25 6 views
-1

Я пытаюсь создать триггер, который вставляет некоторые оценки для студентов на конкретном курсе.Какой параметр отсутствует или он недействителен?

Есть две таблицы, оценки и курсы, я создал представление для этих таблиц, и я хочу создать триггер на этом представлении.

Триггеры необходимо сделать следующее:

  • Если курс существует в course_table, то он должен вставить только класс в grades_table;
  • Если курс course_table отсутствует, то он должен вставляться как в значениях grades_table, так и в поле course_table.

Я пишу этот код:

CREATE OR REPLACE TRIGGER trig_notes_students INSTEAD OF  
INSERT ON view_notes_students  
FOR EACH ROW  
BEGIN  
    DECLARE temp_var NUMBER(2) := 0;  
    BEGIN  
     SET temp_var = (SELECT count(course_id) FROM course_table WHERE course_table.course_id = :new.course_id);  
     IF temp_var = 1 THEN  
      INTO grades_table(grade_id, course_id, grade_value) VALUES (:new.grade_id,:new.course_id,:new.grade_value);  
     ELSE  
      INSERT INTO course_table(course_id, course_name) VALUES (:new.course_id, :new.course_name);  
      INSERT INTO grades_table(grade_id, course_id, grade_value) VALUES (:new.grade_id,:new.course_id,:new.grade_value);  
    END IF;  
    END;  
END;  
/ 

Триггер создается, но я получаю эту ошибку на компиляции.

4/1  PL/SQL: SQL Statement ignored 
4/5  PL/SQL: ORA-00922: missing or invalid option 
+2

Там нет оператора SET в PL/SQL. См. Руководство по назначению значений для переменных: http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/fundamentals.htm#LNPLS00205 –

ответ

1
SET temp_var = (SELECT count(course_id) FROM course_table WHERE course_table.course_id = :new.course_id);  

должен быть

SELECT count(course_id) INTO temp_var FROM course_table WHERE course_table.course_id = :new.course_id;  
+0

Большое спасибо! – PianoSong

0
CREATE OR REPLACE TRIGGER trig_notes_students 
INSTEAD OF INSERT ON view_notes_students  
FOR EACH ROW 
DECLARE 
    temp_var NUMBER(2); 
BEGIN  
    SELECT count(course_id) 
    INTO temp_var 
    FROM course_table 
    WHERE course_table.course_id = :new.course_id; 

    INSERT INTO grades_table(grade_id, course_id, grade_value) VALUES (:new.grade_id,:new.course_id,:new.grade_value);  
    IF temp_var > 0 THEN  
     INSERT INTO course_table(course_id, course_name) VALUES (:new.course_id, :new.course_name);  
    END IF;  
END;  
/
SHOW ERRORS; 
+0

Действительно, это может быть еще одна короткая форма триггера. Спасибо! – PianoSong

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