0

このトリガーは、customer テーブルの古い値と新しい値を追跡することを提案します。変更された値列ごとに新しい行を挿入するだけです。25 列あり、同じことを 25 回書かなければならないと想像してください。これをループで行う方法や、より一般的な方法を維持する方法はありますか。顧客テーブルに新しい列が追加された場合、トリガーを変更する必要がないことを想像してみてください。

   CREATE OR REPLACE TRIGGER KRD_CUSTOMER_UPD_DEL_TRG 
       BEFORE UPDATE OR DELETE ON KRD_CUSTOMER 
       FOR EACH ROW 
    DECLARE 
       V_ISLEMTIPI VARCHAR2(1); 
    BEGIN 
       IF UPDATING THEN 
           if      :OLD.CUSTOMERNAME <> :NEW.CUSTOMERNAME then
        krd_ins_customerTable(p_OldCustomerName => :OLD.CUSTOMERNAME,
                                    p_NewCustomerName => :NEW.CUSTOMERNAME);
       end if;
       end if;

    end;
4

1 に答える 1

0

ビューで列名を使用できます: user_tab_columns。

動作する可能性のあるもの: このビューの列名をループし、その特定の列に対して実行する必要があるステートメントを含む文字列を作成します。

l_statement := 'begin if :OLD.<columname> <> :NEW.<columname> then
        krd_ins_customerTable(p_Old<columname> => :OLD.<columname>,
                                    p_New<columname> => :NEW.<columname>); end;'

execute immediate l_statement;

Ollie が既にコメントしたように: 非等価をチェックするには、null 値もチェックしてください。

If (a is null and b is not null)
or (a is not null and b is null)
or (a is not null and b is not null and a!=b)
于 2012-06-28T11:53:14.867 に答える