防止日期重叠。我们有2个日期,即开始日期和结束日期我们需要编写一个触发器,以防止日期重叠。也就是说,如果我们要输入的开始日期已经存在,那么我们就不能有新条目。我们应该同时考虑两种情况,即new_boking_from> old_booking_from和new_booking_to 相同的代码是:set echo on ;
CREATE OR REPLACE TRIGGER check_booking
BEFORE INSERT ON booking
FOR EACH ROW
BEGIN
if (((:new.resort_id,:new.cabin_no)in (select b.resort_id ,b.cabin_no from booking b))
and
(:new.booking_from) > (select b.booking from booking where :new.resort_id = b.resort_id and :new.guest_no = b.guest_no))
or
(((:new.resort_id,:new.cabin_no)in (select b.resort_id ,b.cabin_no from booking b))
and
(:new.booking_to)< (select b.booking from booking where :new.resort_id = b.resort_id and :new.guest_no = b.guest_no))
then
raise_application_error(-20000, 'This is an overlap');
end if;
end;
/
set echo off;
您将要遇到的问题是变异表异常。您无法查询当前正在更新的表(不要使用自主事务编译,在这里没有必要)。根据您的版本,您可以创建复合触发器。有许多资源将引导您完成整个过程。这是一个入门的地方:blog post。