2017-10-23 36 views
3

私はいくつかの助けが必要です。 私は、挿入、削除、または更新操作が特定のテーブルで実行されるたびに、プロシージャを実行するトリガを作成しようとしています。 はこれがどのコミットする前にトリガが起動するので、トリガーSql Oracle 12cトリガー

CREATE OR REPLACE NONEDITIONABLE TRIGGER NQDI.GAV_TRG 
AFTER INSERT or UPDATE or DELETE ON D_GAV 
FOR EACH ROW 
BEGIN 
    PRC_FILL_D_GAV(:old.report_name); 
END; 

Unofortunatelyが、行われていると私は同じテーブルから読み取る必要があり、それは私を与えている「D_GAVテーブルが変更されて読み取ることができません」エラー。 さらに、for EACH ROWは、すべてのレコードのトリガー開始を変更しますが、すべての更新、挿入または削除がコミットされたときにトリガーを開始するだけですが、これを実行しながら:old.report_nameを保存します。 私は「実行中のプロセス」で私が望むことができることを知っていますが、私はそれを避けたいと思います。私が見落としている他の解決策はありますか?

+0

'FOR EACH ROW'節を削除するだけで、1レコードにつき1回ではなく、1文ごとに1回起動します。しかし、この場合、あなたは ':old.report_name'へのアクセス権がありません。 –

+0

はい、私はそれについて考えましたが、その変数を絶対に必要としている間に、エラー" 'テーブルレベルのトリガーでは許可されていないNEWまたはOLD参照' 'を与えます。 –

+1

トリガーをトランザクション(COMMIT)から分離することはできません。すべての手順を実行し、必要な操作をすべて実行します。 –

答えて

3

化合物トリガーが必要です。各行イベントの後、データを配列に挿入します。ステートメントの後、データをループしてプロシージャを呼び出します。

create or replace trigger nqdi.gav_trg 
for insert or update or delete on d_gav compound trigger 

    type type_table_of_gav is table of d_gav%rowtype; 
    v_gavs type_table_of_gav := type_table_of_gav(); 

    after each row is 
    begin 
    v_gavs.extend(1); 
    v_gavs(v_gavs.count).report_name := coalesce(:old.report_name, :new.report_name); 
    end after each row; 

    after statement is 
    begin 
    for i in 1 .. v_gavs.count loop 
     prc_fill_d_gav(v_gavs(i).report_name); 
    end loop; 
    end after statement; 

end gav_trg; 
関連する問題