BEFORE INSERT TRIGGER 必须执行以下操作:
- 禁止将两名患者分配到年龄相差超过 10 岁的同一房间。
- 此外,触发器还应禁止将允许年龄(小于或等于 10)的两名患者分配到同一张床位。
这意味着:
- 如果新患者比任何已经入院的患者大 10 年左右,他们就不能在同一个房间里。
- 如果新患者与已经入院的患者相距不到 10 年,他们可以在同一个房间,但不能在同一张床。
患者表结构:
PAT_ID CHAR
PAT_NAME CHAR
PAT_GENDER CHAR
PAT_AGE NUMBER
PAT_ADMIT_D CHAR
PAT_WING CHAR
PAT_ROOM# NUMBER
PAT_BED CHAR
到目前为止,我的代码是:
CREATE OR REPLACE TRIGGER assignmentcheck
before insert on patient
for each row
declare
cursor p1_cursor is
select pat_age, pat_room#, pat_bed from patient;
agediff number;
begin
for p1_pat in p1_cursor loop
agediff := p1_pat.pat_age - :new.pat_age;
if (agediff >10) then
if (:new.pat_room# = p1_pat.pat_room#) then
raise_application_error(-20001, 'Age difference greater than 10 cannot be in the same room');
end if;
else if (:new.pat_room# = p1_pat.pat_room#) and (:new.pat_bed = p1_pat.pat_bed) then
raise_application_error(-20002, 'Age difference less than 10 cannot be on the same bed');
end if;
end if;
end loop;
end;
/
一些测试sql:
insert into patient values ('AZ24523', 'Zhou, Alicia', 'F', 24, '14-APR-2015', 'A', 20, 'B');
insert into patient values ('JA33234', 'Abbott, John', 'M', 50, '14-APR-2015', 'A', 16, 'B');
insert into patient values ('AN32676', 'Newman, Andrew', 'M', 10, '14-APR-2015', 'A', 16, 'B');
insert into patient values ('ZZ24523', 'Zhang, Zhaoping', 'F', 38, '14-APR-2015', 'A', 16, 'A');
触发器假定将新行与表中已存在的行进行比较。但到目前为止,我的触发器只在新行之间进行比较,而不是与表中已经存在的行进行比较。
如何使其按预期工作?我一直在到处搜索,但无论如何都找不到与整个表/数据库进行比较。
非常感谢。