Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como obter o número de linhas afetadas por uma instrução quando estiver dentro do gatilho dessa instrução


Uma maneira é usar uma variável global para rastrear o número de linhas, pois não há outra maneira de obter a contagem de linhas de um gatilho de nível de instrução. Você precisaria então de três gatilhos... um nível de instrução para inicializar a variável antes que a instrução seja executada, um nível de linha para adicionar um à variável para cada linha, um nível de instrução para usar a contagem de linhas da maneira que desejar. Primeiro, configure a variável e alguns procedimentos para ajudá-la:
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;
/

O primeiro gatilho para inicializar a variável:
create or replace trigger CUSTOMER_CHANGES_TRIGGER_1
  before insert or update or delete
  on CUSTOMERS
begin
  PKG_ROWCOUNT.INIT_ROWCOUNT;
end;

O segundo a atualizar por linha:
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;
/

O terceiro para exibir o total:
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;