0

我正在尝试编写此触发器,但它无法正常工作。我有一张 GIVING 表(捐赠者、接收者、礼物名称)和一张 PERSONS 表(pname、年龄、头发颜色)。对于触发器,我希望它在捐赠者和接收者的头发颜色相同时吐出一条消息。微不足道,我知道,但我刚刚开始学习触发器并且完全坚持为什么这不起作用。谢谢。

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
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 回答
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 回答