我在桌子上有100多列的触发器。是否有任何有效的方法在oracle上比较列集并确定NEW值不等于OLD值而不是检查每一列?
我正在寻找一些像列一样的独特数字代码。然后将OLD mac与NEW mac ??
进行比较答案 0 :(得分:4)
我通常仍会单独测试每个列以使其更安全。这有点痛苦,但我只是使用数据库为我生成代码:
select ':old.'||column_name||' <> :new.'||column_name||' or'
from user_tab_columns
where table_name = 'MY_TABLE';
然后我复制结果并将其粘贴到我的触发器中(删除末尾的额外“或”)。显然,如果你能这样做会好得多:new&lt;&gt; :old,所以让我们希望在下一个Oracle版本中可以实现。
答案 1 :(得分:2)
我认为以下解决方案适用于AFTER触发器代码逻辑......
SELECT ora_hash( old.ename || old.empno || old.sal ) INTO v_old_hash FROM dual
SELECT ora_hash( new.ename || new.empno || new.sal ) INTO v_new_hash FROM dual
然后比较
IF v_old_hash <> v_new_hash THEN
dbms_output.put_line('Record Change flag');
END IF;
答案 2 :(得分:1)
不幸的是,你无法比较记录。看看documentation:
记录比较
无法针对无效,相等或原则进行本地测试 不等式。这些BOOLEAN表达式是非法的:
- My_Record IS NULL - My_Record_1 = My_Record_2 - My_Record_1 > My_Record_2
您必须编写自己的函数来实现此类测试。
最简单的方法是编写一个接受两个记录(旧的和新的)的过程,如果记录相等/不相等则返回true / false。比使用触发器中的程序。
程序如何检查相等性取决于您 - 比较每个字段或连接所有字段并比较两个字符串。也可以使用连接字符串的哈希值,但您可能知道哈希值可能会发生冲突。