Oracle 获取由 select 子句定义的数据块的校验和值

Oracle get checksum value for a data chunk defined by a select clause

SQL (Oracle) 中是否有任何方法可以使用我得到类似的东西:

select checksum(select * from table) from table;

您可以为此使用 DBMS_SQLHASH.GETHASH。查询结果必须有序且不能包含任何 LOB,否则结果将不确定。

select dbms_sqlhash.gethash(q'[select * from some_table order by 1,2]', digest_type => 1)
from dual;

其中 digest_type 1 = HASH_MD4, 2 = HASH_MD5, 3 = HASH_SH1.

默认情况下,该包未授予任何人。要使用它,您需要有人以 SYS 身份登录并且 运行 这个:

SQL> grant execute on dbms_sqlhash to <your_user>;

查询结果必须排序,如"Bug 17082212 : DBMS_SQLHASH DIFFERENT RESULTS FROM DIFFERENT ACCESS PATH"所述。

我不确定为什么 LOB 不起作用,但这可能与函数 ORA_HASH 不能很好地与 LOB 一起工作的方式有关。 This Jonathan Lewis article includes some examples of ORA_HASH returning different results for the same LOB data. And recent versions of the SQL Language Reference 警告 ORA_HASH 不支持 LOB。