PL / SQL有效的方法来比较大的列集?

时间:2013-11-20 20:11:06

标签: oracle plsql oracle11g

我在桌子上有100多列的触发器。是否有任何有效的方法在oracle上比较列集并确定NEW值不等于OLD值而不是检查每一列?

我正在寻找一些像列一样的独特数字代码。然后将OLD mac与NEW mac ??

进行比较

3 个答案:

答案 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。比使用触发器中的程序。

程序如何检查相等性取决于您 - 比较每个字段或连接所有字段并比较两个字符串。也可以使用连接字符串的哈希值,但您可能知道哈希值可能会发生冲突。