0

1 つのプロシージャと 1 つの関数を含むパッケージを作成しました。関数は、表 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;

関数は挿入された行の列の 1 つを計算することになっており、その入力パラメーターは挿入された行の 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;

これにより、各行の挿入後に関数が呼び出されたにもかかわらず、テーブルの変更エラーが発生するようです。

これを回避し、その関数に挿入された各行で計算を行うにはどうすればよいですか?

4

1 に答える 1

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);
于 2014-07-28T20:54:11.010 に答える