1

次のトリガーがあるとします。

create or replace trigger TR_TEST  
for update or insert or delete  
  on TABLE_X  
compound trigger  
  type array is table of TABLE_X%rowtype index by binary_number;
  recs array;

  before each row is
    i number default rowids.count + 1;
  begin
    recs(i).a := nvl(:NEW.a, :OLD.a);
    recs(i).b := nvl(:NEW.b, :OLD.b);
    recs(i).c := nvl(:NEW.c, :OLD.c);
    recs(i).d := nvl(:NEW.d, :OLD.d);
  end before each row;

  after statement is
  begin
    -- Do procedure here that will throw an exception
  end after statement;

end TR_TEST;

after ステートメントが例外をスローして処理されない場合、配列の内容はどうなりますか? 自動的に消去されますか、それともセッション全体でメモリに残りますか? 後者が当てはまる場合、メモリリークを防ぐためにそれを処理する適切な方法は何ですか? ありがとう!

4

2 に答える 2

1

PL/SQL は自動的に変数の有効範囲を処理します。ユーザーはそれについて心配する必要はありません (実際、それについて明示的にできることは何もありません)。

この場合、配列はトリガーの開始時 (たとえば、最初の行の挿入/更新/削除時) に割り当てられ、トリガーの終了時 (つまり、after ステートメント セクションの終了後、または例外が発生し、発信者に伝播されます)。

トリガーが範囲外になると、配列にアクセスできなくなり、Oracle は後でその裁量で配列に使用されたメモリの割り当てを解除する場合があります。

于 2013-05-16T05:33:10.463 に答える
-1

私の知る限り、トリガーで例外がスローされると、ロールバックが実行されます。

詳細については、 http://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:482821541531を参照してください。

于 2013-05-15T12:36:20.270 に答える