这是针对学校项目的。
我有一个表外科医生,其中包含以下数据: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;
/
此触发器无效:我收到了编译错误。即使我尝试输入显示错误而我也不知道。
我的错误是什么?如何纠正这些条件?
非常感谢您的帮助
答案 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
条件,然后检查。