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の入力パラメーターを受け入れるプロシージャーを宣言できます。 トリガーから直接呼び出します。

    残念ながら、AFTER INSERT / UPDATEスレッドのテーブルから行を選択することに関する他のスレッドの提案は、通常は機能しません。これは通常、変更テーブルの例外につながります。

      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. SQL Serverのパフォーマンスを壊すのではなく、作る

    2. MySQLの日付フィールドで年ごとにグループ化

    3. MySQLで英数字以外の文字のみを含む行を返す2つの方法

    4. 列照合を変更する方法postgresql