Как получить количество строк, затронутых оператором в триггере этого оператора - PullRequest
2 голосов
/ 07 января 2012

У меня есть триггер уровня оператора, который срабатывает всякий раз, когда над таблицей выполняются операции INSERT UPDATE или DELETE (называемые клиентами). Я хочу отобразить сообщение (в DBMS_OUTPUT), содержащее количество строк, которые были вставлены / обновлены / удалены.

Я просто хочу одно сообщение для каждого запускающего оператора, например '4 таблицы были вставлены в таблицу клиентов'. ​​

Как получить доступ к числу строк, на которые влияет оператор триггера, из INSIDE объявления триггера, то есть 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;

Не могу найти ничего в документации, любая помощь приветствуется!

Ответы [ 2 ]

4 голосов
/ 07 января 2012

Одним из способов является использование глобальной переменной для отслеживания количества строк, поскольку нет другого способа получить количество строк из триггера уровня оператора. Затем вам потребуется три триггера ... один уровень оператора для инициализации переменной перед выполнением оператора, один уровень строки для добавления по одному в переменную для каждой строки, один уровень оператора для использования количества строк по вашему желанию. Сначала настройте переменную и несколько процедур, чтобы помочь ей:

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;

Второй для обновления в строке:

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;
/

Третий для отображения суммы:

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;
0 голосов
/ 07 января 2012

Я не уверен на 100 $, доступен ли он внутри AFTER тела триггера, но вы можете попробовать проверить sql%rowcount

...