これは本当にひどい宿題の問題です。実際のシステムでこのようなことをするきっかけになることは決してありません。ほとんどの操作が中断されINSERT
、複数のユーザーがいる場合は失敗します。実際には、制約を使用します。実際には、何らかの理由でトリガーを使用するように強制された場合、それを適切に実行するには、一連の3つのトリガー、パッケージ、およびコレクションが必要になります。
教授がおそらく探しているもの
ただし、強調するだけで、実際のシステムでこれを行うことを検討することは決してありません。
create or replace trigger same_gift_given
before insert on giving
for each row
declare
l_existing_row giving%rowtype;
begin
select *
into l_existing_row
from giving
where giftname = :new.giftname
and rownum = 1;
dbms_output.put_line( :new.giftname ||
' has already been gifted to ' ||
l_existing_row.receiver ||
' from ' ||
l_existing_row.donor );
exception
when no_data_found
then
null;
end;
これにより、重複する行を挿入できます。INSERT ... VALUES
テーブル上で以外のことを行おうとすると、変更トリガーエラーがスローされgiving
ます。非効率的です。複数のセッションを処理しません。要するに、それは絶対に凶悪なコードであり、実際のシステムでは決して使用されるべきではありません。
あなたが実際に何をするか
実際には、制約を作成します
ALTER TABLE giving
ADD CONSTRAINT unique_gift UNIQUE( giftname );
これはマルチユーザー環境で機能します。変更トリガー例外はスローされません。それははるかに効率的です。それははるかに少ないコードです。実際には、重複する行が挿入されるのを防ぎます。