2012-12-21 137 views
0

我正在尝试写这个触发器,但它不能正常工作。我有一张桌子给(捐助者,接收者,礼物名)和一个桌子人(姓名,年龄,头发颜色)。对于触发器,我希望它在捐助者和接收者具有相同的头发颜色时吐出消息。琐碎,我知道,但我刚刚开始学习触发器,并完全停留在为什么这不起作用。谢谢。Oracle触发器简单SQL

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; 

该错误消息我得到的是错误的执行过程中“精确获取回报超过行的请求数量”,指着下面申报行...?

回答

0

您不限制您对查询插入/更新行的授权者/接受者。他们应该是这样的:

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

BTW:你只触发火灾上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; 
+0

谢谢,这解决了我的问题,我可以运行插入,但我没有看到DBMS_output.put_line。我是一名运行oracle sql developer的新手,但我设置了服务器输出,我认为这可以解决我的问题? – user1657563

+0

您是否在SQL-Developer中激活“DBMS输出”?它是否显示你在不同的块中产生的消息,而不是触发器中的消息? –

+0

是启用,但不显示来自dbms_output.put_line的消息。 – user1657563

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; 

或许这可能帮助?

+0

是的,我试着让它为每行,但我仍然得到相同的错误消息。 – user1657563

+0

您是否也使用“新”参考? – span

+0

它不会接受这种改变。无效的参考名称。 – user1657563