Oracle中的变异触发器

时间:2016-09-27 14:09:32

标签: sql database oracle plsql triggers

我创建了以下表格:

create table lessons(
id number,
name_teacher varchar2(9),
name_student varchar2(40),
start_lesson date, 
end_lesson date
);

我插入了以下数据:

insert into lessons values (001,'Peter','Thomas',to_date('2015-12-15','YYYY-MM-DD'),to_date('2015-12-22','YYYY-MM-DD'));
insert into lessons values (002,'Eli','Alice',to_date('2015-06-16','YYYY-MM-DD'),to_date('2015-06-23','YYYY-MM-DD'));
insert into lessons values (003,'Daniel','Thomas',to_date('2015-08-15','YYYY-MM-DD'),to_date('2015-08-20','YYYY-MM-DD'));

您无法通过触发器添加的数据。

insert into lessons values (001,'Peter','Alice',to_date('2015-12-16','YYYY-MM-DD'),to_date('2015-12-25','YYYY-MM-DD'));
insert into lessons values (002,'Eli','Thomas',to_date('2015-06-13','YYYY-MM-DD'),to_date('2015-06-20','YYYY-MM-DD'));

问题是如何制作一个不允许我添加具有时间重叠的教师的学生的触发器,例如“Peter”或“Eli”。

---我的问题---

  

Oracle向我返回了mutants表的错误。

1 个答案:

答案 0 :(得分:1)

你是插入/更新之后的触发器在comlete插入或更新之后触发,而不是在earch行之后触发:

create or replace trigger check_intersections_trg 
on 
 lessons
after insert or update
declare 
  v_res   NUMBER;
begin
  select count(*) 
  into  v_res
  from lessons l1 
  join lessons l2  on l1.name_student = l2.name_student 
                   and l1.start_lesson <= l2.end_lesson
                   and l2.start_lesson <= l1.end_lesson  
  ;
  if v_res > 0 than
   raise_application_error( -20999, 'intersection found');
  end if;
end;
/