Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle ottiene il valore di checksum per un blocco di dati definito da una clausola select

Puoi usare DBMS_SQLHASH.GETHASH per questo. I risultati della query devono essere ordinati e non devono contenere LOB, altrimenti i risultati non saranno deterministici.

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

Dove digest_type 1 =HASH_MD4, 2 =HASH_MD5, 3 =HASH_SH1.

Quel pacchetto non è concesso a nessuno per impostazione predefinita. Per usarlo, avrai bisogno di qualcuno che acceda come SYS ed esegua questo:

SQL> grant execute on dbms_sqlhash to <your_user>;

I risultati della query devono essere ordinati, come descritto in "Bug 17082212:DBMS_SQLHASH RISULTATI DIVERSI DA PERCORSO DI ACCESSO DIVERSO".

Non sono sicuro del motivo per cui i LOB non funzionano, ma potrebbe essere correlato al modo in cui la funzione ORA_HASH non funziona bene con le LOB. Questo articolo di Jonathan Lewis include alcuni esempi di ORA_HASH restituendo risultati diversi per gli stessi dati LOB. E le versioni recenti di SQL Language Reference avvertono che ORA_HASH non supporta le LOB.