遍历oracle表的列

时间:2012-06-28 11:21:26

标签: oracle plsql triggers oracle11g

此触发器建议跟踪客户表上的旧值和新值。 它仅为每个更改的值列插入一个新行。 想象一下,有二十五列,我要写相同的东西25次。 有没有办法在循环中执行此操作或以更好的方式保持更通用。想象一下如果任何新的columnd添加到customer表中,你告诉我的方式就没有必要改变触发器了。

   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;

1 个答案:

答案 0 :(得分: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)