1

これに対する答えを探してみましたが、本当に役立つものは見つかりませんでした。ないか、私の検索機能がノックしたかのどちらかです。とにかく、ここに私の状況があります:

Z_TEST と Z_TEST2 という 2 つの同一のテーブルがある場合があります。必要に応じて、Z_TEST2 を監査テーブルに呼び出します。

両方とも、ID (数値) と CFIELD (CLOB) の 2 つの列があります。Z_TEST には、Z_TEST2 (実際には CLOB フィールドのみ) を挿入または更新するトリガーがあります。

シナリオ 1:

通常のトリガーである Z_TEST で次のトリガーを作成すると、監査テーブルも更新されます。

CREATE OR REPLACE TRIGGER Z_TEST_TRIG


AFTER INSERT OR UPDATE ON Z_TEST
    FOR EACH ROW

Begin
    If inserting then
    Begin
        insert into Z_TEST2 values(:new.ID, :new.CFIELD);
    end;
  end if;

  if updating then
    begin
        update Z_TEST2 Set CFIELD = :new.CFIELD where ID = :new.id;
    end;
  end if;
End;

シナリオ 2:

複合トリガーである次のトリガーを作成し、その「各行の後」ブロックを使用すると、監査テーブルの CLOB は何も null で更新されません。

create or replace trigger Z_TEST_TRIG
FOR UPDATE OR INSERT ON Z_TEST
COMPOUND TRIGGER 

AFTER EACH ROW IS
Begin
    If inserting then
    Begin
        insert into Z_TEST2 values(:new.ID, :new.CFIELD);
    end;
  end if;

  if updating then

    begin
        update Z_TEST2 Set CFIELD = :new.CFIELD where ID = :new.id;
    end;
  end if;
END AFTER EACH ROW;

END Z_TEST_TRIG;

これがシナリオ 1 では機能するのに、2 では機能しない理由を知っている人はいますか? 私たちの WHOLE フレームワークはシナリオ 2 (複合トリガー) に基づいており、CLOB データ型を使用する必要性に最近出くわしたばかりで、この問題が発生しました。

なぜ違いがあり、私のコードには何かが欠けていますか?

4

2 に答える 2

2

この問題に長居する時間がないので、変数を使用して解決しました。

宣言セクションで CLOB 変数を宣言し、:new.clob_field の値を BEFORE EACH ROW または AFTER EACH ROW に割り当て、トリガー内の :new.clob_field ではなく、insert/update ステートメントで変数を使用するこの問題を解決します。

これと戦っている人々による多くの投稿(単純なトリガーではなく、特に複合トリガー)に出くわしたので、これに費やした時間が他の誰かを助け、時間を節約できることを願っています.

BEFORE/AFTER 各行セクションの挿入/更新ステートメントで使用すると、複合トリガーで :new.clob_field の値が失われる理由を知っている人がこの投稿に出くわすと、私の正気を保つのに本当に役立ちます。こんな思いを抱えたまま、いつか死ぬのはつらい…。

また、これが BLOB でも機能すると仮定します (問題が発生する場合)。

于 2013-06-10T07:28:12.803 に答える