Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PL SQL触发多个条件_Sql_Oracle_Triggers - Fatal编程技术网

PL SQL触发多个条件

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

这是一个学校项目

我得到了一个具有以下数据的桌面外科医生:idSurgeon、idType、idRoom、surgeryDate、BeginTime、EndTime。开始时间和结束时间是手术时间的整数。我尝试创建一个触发器,可以防止在同一个房间同时进行两次手术

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之间的碰撞