跨行的Oracle哈希数据

时间:2011-07-01 03:15:11

标签: sql database oracle

假设我有一个包含两列的oracle表:type varchar2和data varchar2。我想知道在plsql或直接oracle sql中是否有一种有效的方法来计算所有数据列的哈希值(理想情况下为sha1,但md5或自定义oracle哈希函数是可接受的)。例如,解决方案的mysql实现可能如下所示:

mysql dialect query:
select type, sha1(group_concat(data order by data separator '')) data_hash from my_table group by type

example output:    
+------+------------------------------------------+
| type | data_hash                                |
+------+------------------------------------------+
| a    | dbe343bfc23545c72f11fc7d2433df3263a71d0d |
| b    | b2baee034a7ed3aa1fa1bd441e141909f1b2f57c |
+------+------------------------------------------+

我更喜欢直接查询游标迭代,而sha1优先于其他哈希。

2 个答案:

答案 0 :(得分:2)

你可以尝试

SELECT type, SUM(ORA_HASH(data)) FROM my_table GROUP BY type

Oracle确实有一个COLLECT,但这不适用于ORA_HASH。在11g你可以做

select deptno, ora_hash(listagg(ename) within group (order by ename))
from emp
group by deptno

答案 1 :(得分:0)

请参阅我对getMD5函数here的回答。另外看一下其他人提到的DBMS_CRYPTO,它使用了较旧的混淆工具包,但方法是相同的。

进行更新,例如:

update my_table
set my_hash = getMD5(col1 || col2 || col3);