0

このトリガーを書き込もうとしていますが、正しく機能していません。私はテーブルGIVING(ドナー、レシーバー、giftname)とテーブルPERSONS(pname、age、haircolor)を持っています。トリガーとして、ドナーとレシーバーが同じ髪の色をしているときはいつでもメッセージを吐き出したいです。些細なことですが、トリガーを学び始めたばかりで、これが機能しない理由に完全に固執しています。ありがとう。

create or replace TRIGGER SameHairColor
BEFORE INSERT OR UPDATE OF GIFTNAME ON GIVING
DECLARE
  haircolordonor varchar(255);
  haircolorreceiver varchar(255);
BEGIN
select persons.haircolor into haircolordonor
from persons, giving
where (donor = persons.pname);
select persons.haircolor into haircolorreceiver
from persons, giving
where (receiver = persons.pname);

if (haircolordonor = haircolorreceiver) then

dbms_output.put_line('Wow, they have the same haircolor!  Who would have thought?');
end if;

end;

私が受け取るエラーメッセージは、実行中のエラーです。「正確なフェッチは要求された数を超える行を返します」、DECLAREの下の行を指しています...?

4

2 に答える 2

0

挿入/更新された行のドナー/レシーバーにクエリを制限していません。これらは次のようになります。

select persons.haircolor
into haircolordonor
from persons
where persons.pname = :NEW.donor;

ところで:あなたのトリガーはでのみ発火しますがINSERT OR UPDATE OF GIFTNAME、それは発火するはずでINSERT OR UPDATE OF donor, receiverあり、あなたはを使用する必要がありますFOR EACH ROW

トリガーは次のようになります。

CREATE OR REPLACE TRIGGER SameHairColor
BEFORE INSERT OR UPDATE OF donor, receiver ON GIVING
  FOR EACH ROW
DECLARE
  haircolordonor varchar(255);
  haircolorreceiver varchar(255);
BEGIN
  select persons.haircolor into haircolordonor
  from persons
  where (persons.pname = :NEW.donor);
  select persons.haircolor into haircolorreceiver
  from persons
  where (persons.pname = :NEW.receiver);

  IF (haircolordonor = haircolorreceiver) THEN
    dbms_output.put_line('Wow, they have the same haircolor!  Who would have thought?');
  END IF;
END;
于 2012-12-21T18:40:03.110 に答える
0
CREATE OR REPLACE TRIGGER SameHairColor
BEFORE INSERT OR UPDATE OF GIFTNAME ON GIVING
REFERENCING NEW ROW AS new
FOR EACH ROW
DECLARE
  haircolordonor varchar(255);
  haircolorreceiver varchar(255);
BEGIN
select persons.haircolor into haircolordonor
from persons, giving
where (:new.donor = persons.pname);
select persons.haircolor into haircolorreceiver
from persons, giving
where (:new.receiver = persons.pname);

if (haircolordonor = haircolorreceiver) then
    dbms_output.put_line('Wow, they have the same haircolor!  Who would have thought?');
end if;

end;

おそらくこれは役立つかもしれませんか?

于 2012-12-21T18:43:00.517 に答える