2015-01-03 3 views
1

Я пытаюсь создать триггер, который вставляет в таблицу ALARMS значения student_id и course_id, когда студент регистрируется на курсе без его необходимого условия, но мне не удалось.Создать триггер с условием

Это мой триггер:

CREATE OR REPLACE TRIGGER ALARM_TRIGGER 
BEFORE INSERT OR UPDATE OF student_id, course_id ON students_courses 
FOR EACH ROW 

BEGIN 
    insert into alarms(student_id, course_id) values(:NEW.student_id, :NEW.course_id); 
END; 

Таблицы:

1-КУРСЫ: которые course_id (PK) и COURSE_NAME.

2-СТУДЕНТЫ: у них есть student_id (PK) и имя студента.

3-STUDENTS_COURSES: у каждого учащегося свои курсы.

4-PREREQUISITE_COURSES: у которых есть необходимое условие для каждого курса.

5-ТРЕВОГИ: Триггер, в котором хранится student_id, course_id, когда любой студент регистрируется в курсе без его предпосылки.

Это пример курсов предпосылка таблицы:

 
COURSE_NUMBER    COURSE_PREREQUISITE 
    1      null 
    2       1 
    3      null 
    4      3 
+1

Итак, student_courses имеет всю историю студента? Пожалуйста, покажите схему COMPLETE. – OldProgrammer

+0

Хорошо, но я не могу поместить схему сейчас, потому что у меня недостаточно репутации. –

+0

просто покажите определение таблицы. – OldProgrammer

ответ

1

Если студент обучается на курсах без предварительного условия, в результате выполнения запросов условий будет NULL. Итак, если курс имеет необходимое условие, и ученик взял предварительное условие, вы хотите, чтобы результат был таким же. Это облегчает последующую логику. Поэтому, если курс имеет необходимое условие, учащийся имеет , а не, результат будет идентификатором курса обязательного условия (вы можете использовать его для отображения значимого сообщения об ошибке).

Запрос возвращать NULL, если курс не имеет предпосылки легко:

select P.COURSE_PREREQUISITE Result 
into RequiredReq 
from Prerequisites P 
where P.COURSE_NUMBER = :new.course_id; 

Конечно, она возвращает курс идентификатор предпосылки, если есть один, но мы позаботимся о том, что позже , Теперь мы хотим, чтобы присоединиться к таблице STUDENTS_COURSES:

join STUDENTS_COURSES SC 
    on SC.COURSE_NUMBER = P.COURSE_PREREQUISITE 
    and SC.Student_ID = :new.Student_ID 

Однако, это не будет давать нам все, что нам нужно. Во-первых, если ученик не взял необходимое условие, запрос ничего не вернет, поэтому мы получим ошибку NO_DATA_FOUND. Во-вторых, если у студента есть, взяв необходимое условие, он вернет идентификатор курса, но в этом случае мы хотим, чтобы он возвращал NULL.

Давайте посмотрим, что мы получим, если мы обратимся внутреннее соединение в левое внешнее соединение:

select P.COURSE_PREREQUISITE Result 
into RequiredReq 
from Prerequisites P 
left join STUDENTS_COURSES SC 
    on SC.COURSE_NUMBER = P.COURSE_PREREQUISITE 
    and SC.Student_ID = :new.Student_ID 
where P.COURSE_NUMBER = :new.course_id; 

Это дает нам все, что мы хотим, но не совсем в правильном направлении. Мы получаем NULL, если необходимое условие имеет не, а обязательное значение, если оно имеет. Таким образом, чтобы изменить его вокруг, нам просто нужно немного логики в запросе:

select case when P.Prerequisite is null then null --> No prerequisite 
      when SC.StudentID is not null then null --> Prerequisite met 
      else P.Prerequisite end Result   --> Prerequisite not met 
into RequiredReq 
from Prerequisites P 
left join STUDENTS_COURSES SC 
    on SC.COURSE_NUMBER = P.COURSE_PREREQUISITE 
    and SC.Student_ID = :new.Student_ID 
where P.COURSE_NUMBER = :new.course_id; 

Теперь NULL означает, что либо курс не имеет предпосылки или студент выполнил предпосылку. Только если у курса есть необходимое условие: и ученик не выполнил, это возвращаемое значение, и это номер курса неудовлетворенного предпосылки.

Примечание: это работает только в том случае, если в ваших примерах есть только одно условие для каждого курса. Если может быть одно или несколько предварительных условий, вы, вероятно, захотите изменить числовые значения с 0, то есть не все или все встреченные предпосылки и ненулевые значения, что означает количество неудовлетворенных предварительных условий.

+0

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

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