BEFORE INSERT TRIGGER は、次のことを行う必要があります。
- 年齢差が 10 歳を超える 2 人の患者を同じ部屋に割り当てることを禁止します。
- さらに、トリガーは、許容年齢 (10 歳以下) の 2 人の患者が同じベッドに割り当てられることも禁止する必要があります。
つまり、次のことを意味します。
- 新しい患者が、すでに入院しているどの患者よりも約 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');
トリガーは、新しい行をテーブルに既に存在する行と比較することを想定しています。しかし、これまでのところ、私のトリガーは新しい行のみを比較しており、既にテーブルにある行とは比較していません。
期待どおりに動作させるにはどうすればよいですか?私はどこでも検索してきましたが、テーブル/データベース全体と比較する方法が見つかりません。
どうもありがとうございました。