sql >> Base de Datos >  >> RDS >> Oracle

Cómo obtener el número de filas afectadas por una declaración cuando está dentro del disparador de esa declaración

Una forma es usar una variable global para realizar un seguimiento del número de filas, ya que no hay otra forma de obtener el recuento de filas desde un activador de nivel de declaración. Entonces necesitaría tres activadores... un nivel de declaración para inicializar la variable antes de que se ejecute la declaración, un nivel de fila para agregar uno a la variable para cada fila, un nivel de declaración para usar el recuento de filas como desee. Primero, configure la variable y algunos procedimientos para ayudarlo:

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

El primer activador para inicializar la variable:

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

El segundo para actualizar por fila:

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

El tercero para mostrar el 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;