sql >> Databasteknik >  >> RDS >> Oracle

Hur man får antalet rader som påverkas av ett uttalande när det är inuti det påståendets utlösare

Ett sätt är att använda en global variabel för att spåra antalet rader eftersom det inte finns något annat sätt att få radantalet från en utlösare på satsnivå. Du skulle då behöva tre triggers... en satsnivå för att initiera variabeln innan satsen körs, en radnivå för att lägga till en till variabeln för varje rad, en satsnivå för att använda radantalet hur du vill. Ställ först in variabeln och några procedurer för att hjälpa den:

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

Den första utlösaren för att initiera variabeln:

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

Den andra att uppdatera per rad:

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

Den tredje som visar totalen:

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;


  1. Relationen skickas till #eller måste vara strukturellt kompatibel. Inkompatibla värden:[:referenser]

  2. Ta bort alla dubbletter av rader utom en i MySQL?

  3. Hur man uppnår PostgreSQL hög tillgänglighet med pgBouncer

  4. Hur DATE() fungerar i MariaDB