PL SQL触发倍数条件

时间:2017-04-14 17:19:28

标签: sql oracle triggers

这是针对学校项目的。

我有一个表外科医生,其中包含以下数据:idSurgeon,idType,idRoom,surgeryDate,BeginTime,EndTime。 (BeginTime和EndTime是手术时间的整数)。我尝试创建一个触发器,可以在同一个房间同时阻止2次手术。

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

此触发器无效:我收到了编译错误。即使我尝试输入显示错误而我也不知道。

我的错误是什么?如何纠正这些条件?

非常感谢您的帮助

3 个答案:

答案 0 :(得分:2)

在触发器中,您必须执行null查找select中与新行重叠的其他行。将SURGEON:old进行比较仅在:new时有效,并且可能唯一的原因是确定是否有任何关键字段(房间,日期,时间)发生了变化;如果没有,您可能想跳过碰撞检查。

答案 1 :(得分:1)

(抱歉英语不好) 如果它对于学校项目最简单的方式是

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 table
create table SURGEONBYHOUR
(
  uniqid VARCHAR2(19) not null
);

然后是唯一索引

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

对于测试:SURGEON表是 - 创建表

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

答案 2 :(得分:0)

尝试删除位于class Window(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): comboStatsText = QLabel('Home Team', self) comboStatsText.move(15, 10) comboStatsBox = QComboBox(self) comboStatsBox.move(15, 30) #Combo Box Data comboStatsBox.addItem(name) comboStatsBox.addItem(name1) 末尾的;以及when条件,然后检查。