我创建了一个包含一个过程和一个函数的包。 在表REZULTAT上的每一行之后插入触发器调用函数。
create or replace trigger rezultat_compound
for insert on rezultat
compound trigger
v_igid rezultat.igra_id%type;
v_reid rezultat.id%type;
v_jck rezultat.jocker_broj%type;
cursor cur_type is rezultat%rowtype;
before each row is
begin
v_reid:=rezultat_seq.nextval;
:new.id:=v_reid;
v_igid:=:new.igra_id;
end before each row;
after each row is
begin
v_jck:=loto_7_47_pck.getJockerBroj(v_igid);
end after each row;
end rezultat_compound;
函数应该计算插入行的其中一列,并且其输入参数是插入行的ID,我用它在记录类型计算之前选择特定插入行为记录类型。
function getJockerBroj
( i_igra_id igra.id%type
)
return rezultat.jocker_broj%type
is
v_jocker rezultat.jocker_broj%type;
rezultat_rec brojevi_type;
begin
select br1
, br2
, br3
, br4
, br5
, br6
, br7
,dopunski_broj
into rezultat_rec
from rezultat
where igra_id=i_igra_id;
v_jocker:=
( substr(to_char(rezultat_rec.br1),-1, 1)
|| substr(to_char(rezultat_rec.br2),-1, 1)
|| substr(to_char(rezultat_rec.br3),-1, 1)
|| substr(to_char(rezultat_rec.br4),-1, 1)
|| substr(to_char(rezultat_rec.br5),-1, 1)
|| substr(to_char(rezultat_rec.br6),-1, 1)
|| substr(to_char(rezultat_rec.br7),-1, 1)
)
;
return v_jocker;
end;
这显然会导致变异表错误,即使在每行插入后调用该函数。
如何绕过这个并对该函数中每个插入的行进行计算?
答案 0 :(得分:0)
触发器(以及触发器调用的任何函数)不允许查询rezultat
表,因为触发器是rezultat
表上定义的行级。正如您所发现的那样,这样做会导致变异表异常。
通常,您希望对逻辑进行编码,以便仅引用:new
伪记录中的数据。在这种情况下,例如,您可以定义函数以接受7个参数并从触发器传递这些参数值。像
CREATE OR REPLACE FUNCTION getJockerBroj (
p_br1 in rezultat.br1%type,
p_br2 in rezultat.br2%type,
p_br3 in rezultat.br3%type,
p_br4 in rezultat.br4%type,
p_br5 in rezultat.br5%type,
p_br6 in rezultat.br6%type,
p_br7 in rezultat.br7%type
)
RETURN rezultat.jocker_broj%type
IS
BEGIN
RETURN substr(to_char(p_br1),-1, 1)
|| substr(to_char(p_br2),-1, 1)
|| substr(to_char(p_br3),-1, 1)
|| substr(to_char(p_br4),-1, 1)
|| substr(to_char(p_br5),-1, 1)
|| substr(to_char(p_br6),-1, 1)
|| substr(to_char(p_br7),-1, 1);
END;
然后您的触发器将执行类似
的操作v_jck:=loto_7_47_pck.getJockerBroj(:new.br1,
:new.br2,
:new.br3,
:new.br4,
:new.br5,
:new.br6,
:new.br7);