(對不起,沒有得到很好的英文) 如果它是學校項目最簡單的方法是
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
表 - 測試
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);
創建表
值您忘記 – GurV
你在你的WHEN子句的結尾有一個多餘的分號來問一個問題。另外,我不認爲這個條款對你想要做的事情是必要的。 –
我想檢查在同一日期,同一房間和同一時間沒有手術。我在when子句的末尾刪除了分號,並且仍然存在編譯錯誤。 –