Использование триггеров для вставки значения или выдачи ошибки - PullRequest
0 голосов
/ 24 мая 2018

Я хочу создать триггер, который срабатывает перед вставкой в ​​таблицу ENROLLMENT, которая связана с таблицей COURSE_SECTION через C_SEC_ID.Триггер срабатывает при добавлении новой регистрации.Прежде чем он может вставить запись, он просматривает столбцы MAX_ENRL и CURR_ENRL таблицы COURSE_SECTION и проверяет ее, если условие выполнено (то есть CURR_ENRL

Это то, что я сделал до сих пор, но я не знаю, как просто проверить правильность соответствующего C_SEC_ID.

CREATE OR REPLACE TRIGGER TRG_INCRE_ENRL_NUM
BEFORE INSERT ON ENROLLMENT 
FOR EACH ROW
BEGIN
IF COURSE_SECTION.CURR_ENRL < COURSE_SECTION.MAX_ENRL THEN
COURSE_SECTION.CURR_ENRL := COURSE_SECTION.CURR_ENRL + 1;
ELSE RAISE_APPLICATION_ERROR(-20005, 'Failure in trigger TRG_INCR_ENRL_NUM: 
Max Enrollment reached.');
END IF;
NULL;
END;

1 Ответ

0 голосов
/ 24 мая 2018

Выполните сравнение в запросе выбора до COURSE_SECTION с регистром и используя столбец :NEW.c_sec_id.UPDATE таблица, если условие истинно, иначе выдает ошибку.Это предполагает, что ваша таблица course_section всегда будет иметь одну строку для данного c_sec_id, в противном случае вам, возможно, придется обрабатывать no_data_found или использовать MAX, MIN вВаш запрос на выбор.

CREATE OR replace TRIGGER trg_incre_enrl_num 
BEFORE INSERT ON enrollment 
FOR EACH ROW 

DECLARE v_condition PLS_INTEGER := 0; 

BEGIN 
  SELECT 
         CASE 
                WHEN curr_enrl < max_enrl 
                THEN 1 
                ELSE 0 
         END 
   INTO   v_condition 
  FROM   course_section 
 WHERE  c_sec_id = :NEW.c_sec_id; 

  IF v_condition = 1 THEN 
    UPDATE course_section 
    SET    curr_enrl = curr_enrl + 1; --increment the value in table.

  ELSE 
    raise_application_error(-20005, 'Failure in trigger TRG_INCR_ENRL_NUM: Max Enrollment reached.'); 
  END IF; 
END;
/
...