2017-12-09 8 views
0

トリガ内で呼び出すストアドプロシージャに値を渡さない「挿入後」トリガに問題があります。 それは更新のためにうまく動作し、また私は私が呼んでいるプロシージャのテーブルを照会していることを言及する必要があります。手順は、現在の挿入/更新された行に基づいて、表1に追加すべきかについてtable2のヒントにTABLE1および挿入の内側に見えるORACLE - トリガーがプロシージャに値を渡していない

create or replace trigger test_trg 
after insert or update on table1 
for each row 
begin 
    test_procedure(:new.value1); 
end; 

: それは次のようになります。

ありがとうございます!

+1

表示されないコードはデバッグできません。いくつかのサンプルデータと共に、呼び出されたプロシージャのソースを投稿してください。 – APC

答えて

0

トリガートランザクションは、ステートメントトランザクションによって異なります。したがって、コミットされていないレコードは読み取ることができません。したがって、 "test_procedure"コードをトリガに転送して使用する必要があります。新しいレコード値を使用して、table2にデータを挿入します。 コードは次のようになります:

create or replace trigger test_trg 
after insert or update on table1 
for each row 
begin 
    if inserting then 
     insert into table2(ID, F1, F2, ...) 
     values (NEW_ID_VALUE, :NEW.F1_VALUE, :NEW.F2_VALUE, ...); 
    elsif updateing then 
     update table2 
     set F1 = :NEW.F1_VALUE 
     , F2 = :NEW.F2_VALUE 
     where TABLE1_ID_FK = :NEW.ID; 
    end if; 
end; 
+0

少し訂正: 'updateing' - >' updating' –

+1

ありがとう@BarbarosÖzhan。 –

+0

アイデアありがとう。 これは非常に大きくてむしろ面倒な引き金になるかもしれませんが、うまくいくかもしれません。 他に何も気がつかなければ、私はそれに行くと思う。 –

0

見つけました! 問題はトリガではなく、手順にありました。私は送信していたレコードID(新しい行のレコードID)に基づいて "ダーティーリード"を実行していました。 私のトリガーは「挿入後」ですが、プロシージャーで行が見つからず、すべての操作を基にしていたようです。

プロシージャにパラメータを追加し、必要なものすべてに対してトリガから新しい値を直接渡すことで修正しました。

関連する問題