2016-02-11 70 views
0

我有一个触发器:之前,INSERT触发器获得 '太多行' 错误

create or replace trigger trig 
    before insert on sistem 
    for each row 
declare 
    v_orta number; 
begin 
    SELECT v_orta INTO :new.orta_qiymet 
    FROM sistem; 
    v_orta:=(:new.riyaziyyat+:new.fizika)/2; 

    insert into sistem(orta_qiymet) 
    values(v_orta); 

end trig; 

当我插入一行:

insert into sistem(riyaziyyat,fizika) values(4,4) 

我得到一个错误:

error capture

为什么我得到那个错误?

+0

是否有一个原因,你不能将错误复制到问题的文本?除非'sistem'只有一行 - 这只适用于你的第二次插入 - 选择将始终是错误的。你也要求一个变异的表错误。你为什么选择?无论如何你都不会使用选择的'v_orta'。为什么你再次插入同一张表?这将导致无限循环...也许你可以解释你实际上想要做什么? –

回答

2

这从根本上不理解触发器是如何工作的。你通常不能从触发器所在的表中进行选择,并且before-insert触发器不应该再次插入到同一个表中 - 因为这只会导致触发器无限次地再次触发(直到Oracle通知并停止它)。您目前还没有使用您试图查询的v_orta值。

我怀疑你认为触发而不是原来的插入或许,真的要设置新插入的行中的orta_qiymet值会自动根据您提供的其他两列。要做到这一点,你不(也不能)选择这些值;相反,你指的the :NEW pseudorecord因为你已经这样做,然后设置在同一pseudorow第三列的值:

create or replace trigger trig 
    before insert on sistem 
    for each row 
begin 
    :new.orta_qiymet := (:new.riyaziyyat + :new.fizika)/2; 
end trig; 
/

有很多的文档中的信息;这与one of the examples类似。

+0

非常感谢你! :)我做了一个错误的举动..谢谢) –