Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Oracle PL/SQL:Meneruskan seluruh baris ke prosedur dari pemicu

Dalam sebagian besar kasus, satu-satunya cara untuk menetapkan nilai baru di baris ke variabel %ROWTYPE adalah dengan menetapkan setiap kolom secara eksplisit. Sesuatu seperti

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;

Jika tabel Anda dideklarasikan berdasarkan sebuah objek, :NEW akan menjadi objek dari tipe tersebut. Jadi jika Anda memiliki tabel seperti

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

CREATE TABLE foo OF obj_foo;

maka Anda dapat mendeklarasikan prosedur yang menerima parameter input bertipe OBJ_FOO dan hubungi langsung dari pemicu Anda.

Saran di utas lain tentang memilih baris dari tabel di utas AFTER INSERT/UPDATE, sayangnya, umumnya tidak berfungsi. Itu umumnya akan menyebabkan pengecualian tabel bermutasi.

  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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pembaruan kunci utama vs penghapusan kunci utama + penyisipan

  2. Groovy Oracle Stored Proc - indeks kolom invaid

  3. Pengidentifikasi tidak valid dalam kueri bersarang ganda dengan ORDER BY dan ROWNUM

  4. Teks tampilan pencarian Oracle

  5. Menggunakan LogMiner Untuk Menemukan Perubahan Saat Ini