关于触发器

问题描述 投票:0回答:1

防止日期重叠。我们有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;

sql oracle plsql database-trigger
1个回答
0
投票

您将要遇到的问题是变异表异常。您无法查询当前正在更新的表(不要使用自主事务编译,在这里没有必要)。根据您的版本,您可以创建复合触发器。有许多资源将引导您完成整个过程。这是一个入门的地方:blog post

© www.soinside.com 2019 - 2024. All rights reserved.