0

此触发器建议跟踪客户表上的旧值和新值。它只为每个更改的值列插入一个新行。想象一下有 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 已经评论过的:要检查不相等,还要检查空值。

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 回答