3

テーブル(customersと呼ばれる)でINSERTUPDATEまたはDELETE操作が実行されるたびに起動するステートメントレベルのトリガーがあります。挿入/更新/削除された行数を含むメッセージを(DBMS_OUTPUTに)表示したい。

トリガーステートメントごとに1つのメッセージが必要です。たとえば、「4行がcustomersテーブルに挿入されました」。

トリガー宣言の内側、つまり以下のコードのXXXから、トリガーステートメントの影響を受ける行数にアクセスするにはどうすればよいですか。

CREATE OR REPLACE TRIGGER customer_changes_trigger_2
AFTER INSERT OR UPDATE OR DELETE ON customers

DECLARE
v_operation   VARCHAR(10);
v_number_rows NUMBER;


BEGIN

v_number := XXX;

IF INSERTING THEN
   v_operation := 'inserted';
END IF;

IF UPDATING THEN
   v_operation := 'updated';
END IF;

IF DELETING THEN
   v_operation := 'deleted';
END IF;

DBMS_OUTPUT.PUT_LINE
          (v_number_rows|| ' rows were ' || v_operation || ' from customers.');
END;

ドキュメントに何も見つかりません。助けていただければ幸いです。

4

2 に答える 2

4

1つの方法は、グローバル変数を使用して行数を追跡することです。ステートメントレベルのトリガーから行数を取得する方法は他にありません。次に、3つのトリガーが必要になります...ステートメントを実行する前に変数を初期化するための1つのステートメントレベル、各行の変数に1つ追加するための1つの行レベル、必要に応じて行数を使用するための1つのステートメントレベル。まず、変数とそれを支援するためのいくつかの手順を設定します。

create or replace package PKG_ROWCOUNT is
  NUMROWS   number;

  procedure INIT_ROWCOUNT;

  procedure ADD_ONE;

  function GET_ROWCOUNT
    return number;
end PKG_ROWCOUNT;
/

create or replace package body PKG_ROWCOUNT as
  procedure INIT_ROWCOUNT is
  begin
    NUMROWS := 0;
  end;

  procedure ADD_ONE is
  begin
    NUMROWS := Nvl(NUMROWS, 0) + 1;
  end;

  function GET_ROWCOUNT
    return number is
  begin
    return NUMROWS;
  end;
end PKG_ROWCOUNT;
/

変数を初期化する最初のトリガー:

create or replace trigger CUSTOMER_CHANGES_TRIGGER_1
  before insert or update or delete
  on CUSTOMERS
begin
  PKG_ROWCOUNT.INIT_ROWCOUNT;
end;

行ごとに更新する2番目:

create or replace trigger CUSTOMER_CHANGES_TRIGGER_2
  after insert or update or delete
  on CUSTOMERS
  for each row
begin
  PKG_ROWCOUNT.ADD_ONE;
end;
/

合計を表示する3番目:

create or replace trigger CUSTOMER_CHANGES_TRIGGER_3
  after insert or update or delete
  on CUSTOMERS
begin
   Dbms_output.
   PUT_LINE(PKG_ROWCOUNT.GET_ROWCOUNT || ' rows were affected.');
end;
于 2012-01-07T16:45:33.053 に答える
-1

トリガー本体内で利用できるかどうかは100ドルわかりませんAFTERが、調べてみることができますsql%rowcount

于 2012-01-07T15:04:04.680 に答える