Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment obtenir le nombre de lignes affectées par une instruction à l'intérieur du déclencheur de cette instruction

Une façon consiste à utiliser une variable globale pour suivre le nombre de lignes car il n'y a pas d'autre moyen d'obtenir le nombre de lignes à partir d'un déclencheur au niveau de l'instruction. Vous auriez alors besoin de trois déclencheurs... un niveau d'instruction pour initialiser la variable avant l'exécution de l'instruction, un niveau de ligne pour en ajouter un à la variable pour chaque ligne, un niveau d'instruction pour utiliser le nombre de lignes comme vous le souhaitez. Tout d'abord, configurez la variable et quelques procédures pour l'aider :

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

Le premier trigger pour initialiser la variable :

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

La seconde à mettre à jour par ligne :

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

Le troisième pour afficher le 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;