PL SQL触发多个条件
这是一个学校项目 我得到了一个具有以下数据的桌面外科医生:idSurgeon、idType、idRoom、surgeryDate、BeginTime、EndTime。开始时间和结束时间是手术时间的整数。我尝试创建一个触发器,可以防止在同一个房间同时进行两次手术PL SQL触发多个条件,sql,oracle,triggers,Sql,Oracle,Triggers,这是一个学校项目 我得到了一个具有以下数据的桌面外科医生:idSurgeon、idType、idRoom、surgeryDate、BeginTime、EndTime。开始时间和结束时间是手术时间的整数。我尝试创建一个触发器,可以防止在同一个房间同时进行两次手术 CREATE TRIGGER I_PreventSurgery BEFORE INSERT ON SURGEON FOR EACH ROW WHEN ( (old.surgeryDate = new.surgeryDate) and (o
CREATE TRIGGER I_PreventSurgery
BEFORE INSERT ON SURGEON
FOR EACH ROW
WHEN ( (old.surgeryDate = new.surgeryDate) and (old.idRoom =
new.idRoom) );
BEGIN
IF ( ((:new.BeginTime >= old.BeginTime) and (:new.BeginTime >=
:old.EndTime)) and ((:new.EndTime <= old.EndTime) and (:EndTime >=
:old.BeginTime)) );
THEN
raise_application_error(-20100, '2 surgeries at the same times');
END;
/
这个触发器不工作:我有一个编译错误。即使我尝试输入show errors,但我不明白
我的错误是什么?如何纠正这些情况
非常感谢您的帮助在触发器中,您必须进行选择,以查找与新行重叠的其他行。比较:旧与:新仅在更新时起作用,这样做的唯一原因可能是确定任何关键现场房间、日期、时间是否已更改;如果没有,您可能希望跳过冲突检查。在触发器中,您必须进行选择,以查找与新行重叠的其他行。比较:旧与:新仅在更新时起作用,这样做的唯一原因可能是确定任何关键现场房间、日期、时间是否已更改;如果没有,您可能希望跳过碰撞检查。尝试删除;这是在when结束时,也是来自if条件并检查。尝试移除;这是在when结尾,也是来自if条件和check。很抱歉英语不好 如果是学校项目,最简单的方法是
CREATE OR REPLACE TRIGGER I_PreventSurgery
BEFORE INSERT ON SURGEON
FOR EACH ROW
BEGIN
for R in (select *
from SURGEON T
where T.IDROOM = :new.idroom
and T.SURGERYDATE = :new.surgerydate
and :new.begintime <= T.endtime and :new.endtime >= T.begintime)
loop
raise_application_error(-20100, '2 surgeries at the same times');
end loop;
end;
然后是唯一索引
-- Create/Recreate indexes
create unique index I_SURGEONBYHOUR_UNIQID on SURGEONBYHOUR (UNIQID);
触发器将是这个
CREATE OR REPLACE TRIGGER I_PreventSurgery
BEFORE INSERT ON SURGEON
FOR EACH ROW
BEGIN
for li in :new.begintime .. :new.endtime
loop
insert into SURGEONBYHOUR
(UNIQID)
values
(to_char(:new.surgerydate, 'yyyymmdd') ||
lpad(:new.idroom, 4, '0') || lpad(li, 2, '0'));
end loop;
end;
测试:手术台是
-创建表
CREATE TABLE SURGEON
(
IDSURGEON NUMBER,
IDTYPE NUMBER,
IDROOM VARCHAR2(4),
SURGERYDATE DATE,
BEGINTIME NUMBER,
ENDTIME NUMBER
);
测试值
insert into surgeon
(idsurgeon, idtype, idroom, surgerydate, begintime, endtime)
values
(1, 1, 52, '01/01/17', 11, 13);
insert into surgeon
(idsurgeon, idtype, idroom, surgerydate, begintime, endtime)
values
(2, 1, 53, '01/01/17', 12, 15);
insert into surgeon
(idsurgeon, idtype, idroom, surgerydate, begintime, endtime)
values
(3, 2, 52, '01/01/17', 12, 14);
对不起,我英语不好
如果是学校项目,最简单的方法是
CREATE OR REPLACE TRIGGER I_PreventSurgery
BEFORE INSERT ON SURGEON
FOR EACH ROW
BEGIN
for R in (select *
from SURGEON T
where T.IDROOM = :new.idroom
and T.SURGERYDATE = :new.surgerydate
and :new.begintime <= T.endtime and :new.endtime >= T.begintime)
loop
raise_application_error(-20100, '2 surgeries at the same times');
end loop;
end;
然后是唯一索引
-- Create/Recreate indexes
create unique index I_SURGEONBYHOUR_UNIQID on SURGEONBYHOUR (UNIQID);
触发器将是这个
CREATE OR REPLACE TRIGGER I_PreventSurgery
BEFORE INSERT ON SURGEON
FOR EACH ROW
BEGIN
for li in :new.begintime .. :new.endtime
loop
insert into SURGEONBYHOUR
(UNIQID)
values
(to_char(:new.surgerydate, 'yyyymmdd') ||
lpad(:new.idroom, 4, '0') || lpad(li, 2, '0'));
end loop;
end;
测试:手术台是
-创建表
CREATE TABLE SURGEON
(
IDSURGEON NUMBER,
IDTYPE NUMBER,
IDROOM VARCHAR2(4),
SURGERYDATE DATE,
BEGINTIME NUMBER,
ENDTIME NUMBER
);
测试值
insert into surgeon
(idsurgeon, idtype, idroom, surgerydate, begintime, endtime)
values
(1, 1, 52, '01/01/17', 11, 13);
insert into surgeon
(idsurgeon, idtype, idroom, surgerydate, begintime, endtime)
values
(2, 1, 53, '01/01/17', 12, 15);
insert into surgeon
(idsurgeon, idtype, idroom, surgerydate, begintime, endtime)
values
(3, 2, 52, '01/01/17', 12, 14);
你忘了问一个问题。你的WHEN子句末尾有一个多余的分号。另外,我不认为这一条款对你所要做的事情是必要的。我想检查一下,在同一日期、同一房间、同一时间没有手术。我删除了when子句末尾的分号,但仍然有编译错误。精度:same time=BeginTime和EndTime->2个整数值。@Seyran你能告诉我怎么做吗?你忘了问问题when子句末尾有一个无关的分号。另外,我不认为这一条款对你所要做的事情是必要的。我想检查一下,在同一日期、同一房间、同一时间没有手术。我删除了when子句末尾的分号,但仍然存在编译错误。精度:same time=BeginTime和EndTime->2个整数值。@Seyran你能告诉我怎么做吗?你能告诉我如何使触发器工作以防止插入吗?@Jean FrançoisGirard看Seyran的回答你能告诉我如何使触发器工作吗努力防止插入?@Jean-FrançoisGirard看看Seyran的回答你可以缩短检查时间并使其正确工作:而不是:new.begintime=t.begintime或:new.endtime>=t.begintime和:new.endtime t.begintime。您的检查无法检测到例如:new=01:00-05:00和T=02:00-04:00之间的冲突您可以缩短检查时间并使其正常工作:而不是:new.begintime=T.begintime或:new.endtime>=T.begintime和:new.endtime T.begintime。您的检查无法检测到例如:new=01:00-05:00和T=02:00-04:00之间的碰撞