2011-12-22 10 views
0

私はトリガーを行う必要がありますが、私がしようとしている唯一の違いは ':new.COLUMN_NAME'と ':old.COLUMN_NAME'に基づいて動的値を取得することですトリガー内の動的column_nameに応じた動的column_value

私は、クエリ内のテーブルの列を持っていますし、その後、私はLOOPのためにそれを実行...

これが私のトリガーである:私はトリガーをコンパイルするとき

CREATE OR REPLACE TRIGGER aft_ins_soliccambio 
AFTER INSERT OR DELETE OR UPDATE 
ON SEG_V_SOLICCAMBIO 
REFERENCING OLD AS OLD NEW AS NEW 
FOR EACH ROW 
DECLARE 
    old_col_value VARCHAR2 (4000); 
    new_col_value VARCHAR2 (4000); 
BEGIN 
    FOR REC IN ( SELECT OWNER, TABLE_NAME, COLUMN_NAME 
        FROM all_tab_columns 
        WHERE OWNER = 'EUCEDA' AND (TABLE_NAME = 'SEG_V_SOLICCAMBIO') 
       ORDER BY column_id) 
    LOOP 
     EXECUTE IMMEDIATE ' select :new.' || REC.COLUMN_NAME || ' from dual' 
       INTO new_col_value; 

     pkg_tumi.insert_auditoria ('SEG_V_SOLICCAMBIO', 
           REC.COLUMN_NAME, 
           :new.EMPR_IDEMPRESA_N, 
           fn_get_pk ('SEG_V_SOLICCAMBIO', 1), 
           fn_get_pk ('SEG_V_SOLICCAMBIO', 2), 
           fn_get_pk ('SEG_V_SOLICCAMBIO', 3), 
           fn_get_pk ('SEG_V_SOLICCAMBIO', 4), 
           fn_get_pk ('SEG_V_SOLICCAMBIO', 5), 
           fn_get_pk ('SEG_V_SOLICCAMBIO', 6), 
           1, 
           '', 
           new_col_value, 
           SYSDATE, 
           NULL); 
    END LOOP; 
END; 

それはdoesnのエラーはスローされませんが、テーブルに新しい値を挿入しようとすると、トリッジを作成していますRそれは、このエラースロー:私は問題が間にあることに気づいた問題点をチェック

ORA-01008: no todas las variables han sido enlazadas ORA-06512: en "EUCEDA.AFT_INS_SOLICCAMBIO", línea 10 ORA-04088: error durante la ejecución del disparador 'EUCEDA.AFT_INS_SOLICCAMBIO'

を「.. IMMEDIATE EXECUTE」私はのためにそれがある参照してください。new.'dynamic_column」が認識されていません。助けてください!私はこの問題で何時間もあり、私はそれを解決することができません。

ありがとう、ごめんなさい、私の英語です。

答えて

0

:newおよび:oldトリガー内の多少の柔軟性はありません。 EXECUTE IMMEDIATEで何をしようとしているのかを動的SQLを使って調べる方法はわかりません。私はそれが不可能だと思う。

私が知っている唯一の選択肢は多少面倒です。そのような代替は、次のようなCASE式でEXECUTE IMMEDIATEを交換することである。

new_col_value := CASE REC.COLUMN_NAME 
         WHEN 'COLUMN_1' THEN :new.column_1 
         WHEN 'COLUMN_2' THEN :new.column_2 
         WHEN 'COLUMN_3' THEN :new.column_3 
         ... 
        END; 

それらすべてを入力するのではなく、このCASE文の中WHEN ... THEN ...ラインの全てを生成するために、適切なSQLステートメントを実行することは可能かもしれませんあなた自身で。

+0

ありがとうございました!!!それは私がそれを使用したときに非常に便利でした。私はあきらめて答えは光のようでした(= 私はそれを試してきましたが、それはうまくいきました(私のコードを調整してください)。ありがとうございます!^^ – user1112291

関連する問題