2016-09-27 109 views
0

突变触发我创建如下表:在甲骨文

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

我插入以下DATAS:

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')); 

的问题是如何使一个触发器,它不允许我加入谁拥有谁在时间上重叠,如“彼得”和“礼”的老师的学生。

---我的问题---

Oracle返回我突变表的误差。

+2

安置自己的触发器主体 – XING

+2

信息不足。发布触发器代码。 –

+0

看起来你的问题是关于防止重叠范围,这是一个老问题,没有直接的解决方案。很容易解决“变异表”错误,但在多用户系统中,仍然需要一些锁定来防止两个会话输入在其自己的会话中有效但是一旦提交就重叠的行。 –

回答

1

你插入/更新触发后neen的是,comlete插入或更新后的火灾和不连续操作搜索后:

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; 
/