此触发器建议跟踪客户表上的旧值和新值。 它仅为每个更改的值列插入一个新行。 想象一下,有二十五列,我要写相同的东西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;
答案 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)