Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle PL/SQL:Препращане на целия ред към процедура от тригер

В по-голямата част от случаите единственият начин да присвоите новите стойности в реда на променлива %ROWTYPE би бил изрично да присвоите всяка колона. Нещо като

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;

Ако се случи вашата таблица да бъде декларирана въз основа на обект, :NEW ще бъде обект от този тип. Така че, ако имате таблица като

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

CREATE TABLE foo OF obj_foo;

тогава можете да декларирате процедури, които приемат входни параметри от тип OBJ_FOO и ги извикайте директно от вашия тригер.

Предложението в другата нишка за избиране на реда от таблицата в нишка СЛЕД ВМЪКВАНЕ/АКТУАЛИЗИРАНЕ, за съжаление, обикновено не работи. Това обикновено води до изключение на променяща се таблица.

  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. Сървърът на Oracle 12c не може да бъде достъпен от отдалечен компютър чрез .Net доставчика

  2. Oracle SQL:Експортирайте в CSV, като избягвате нови редове

  3. Разделени Blob данни в Oracle

  4. Ограничете ConnectionTimeout за Oracle Database

  5. Oracle променя таблицата с недостатъчни привилегии