sql >> Database >  >> RDS >> Oracle

Oracle PL/SQL:hele rij doorsturen naar procedure vanaf een trigger

In de overgrote meerderheid van de gevallen zou de enige manier om de nieuwe waarden in de rij toe te wijzen aan een %ROWTYPE-variabele zijn om elke kolom expliciet toe te wijzen. Iets als

CREATE OR REPLACE TRIGGER some_trigger_name
  BEFORE INSERT OR UPDATE ON some_table
  FOR EACH ROW
DECLARE
  l_row some_table%rowtype;
BEGIN
  l_row.column1 := :NEW.column1;
  l_row.column2 := :NEW.column2;
  ...
  l_row.columnN := :NEW.columnN;

  procedure1( l_row );
  procedure2( l_row );
  procedure3( l_row );
END;

Als uw tabel wordt gedeclareerd op basis van een object, is :NEW een object van dat type. Dus als je een tafel hebt zoals

CREATE OR REPLACE TYPE obj_foo 
    AS OBJECT (
      column1 NUMBER,
      column2 NUMBER,
      ...
      columnN NUMBER );

CREATE TABLE foo OF obj_foo;

dan zou je procedures kunnen declareren die invoerparameters van het type OBJ_FOO accepteren en bel die rechtstreeks vanaf je trigger.

De suggestie in de andere thread over het selecteren van de rij uit de tabel in een AFTER INSERT/UPDATE-thread werkt helaas over het algemeen niet. Dat zal over het algemeen leiden tot een muterende tabeluitzondering.

  1  create table foo (
  2    col1 number,
  3    col2 number
  4* )
SQL> /

Table created.

SQL> create procedure foo_proc( p_foo in foo%rowtype )
  2  as
  3  begin
  4    dbms_output.put_line( 'In foo_proc' );
  5  end;
  6  /

Procedure created.

SQL> create or replace trigger trg_foo
  2    after insert or update on foo
  3    for each row
  4  declare
  5    l_row foo%rowtype;
  6  begin
  7    select *
  8      into l_row
  9      from foo
 10     where col1 = :new.col1;
 11    foo_proc( l_row );
 12  end;
 13  /

Trigger created.

SQL> insert into foo values( 1, 2 );
insert into foo values( 1, 2 )
            *
ERROR at line 1:
ORA-04091: table SCOTT.FOO is mutating, trigger/function may not see it
ORA-06512: at "SCOTT.TRG_FOO", line 4
ORA-04088: error during execution of trigger 'SCOTT.TRG_FOO'


  1. Natural Join in SQL begrijpen

  2. Het ROOT-wachtwoord opnieuw instellen in MySQL 5.6

  3. Hoe schrijf je een geparametriseerde SQL-query in javascript?

  4. Oracle SQL PIVOT-tabel