ORA_HASH
er bestemt deterministisk for datatyper, der kan bruges til partitionering, såsom NUMBER, VARCHAR, DATE osv.
Men ORA_HASH
er ikke deterministisk for i det mindste nogle af de andre datatyper, såsom CLOB.
Mit svar er baseret på dette
Jonathan Lewis artikel om ORA_HASH
.
Jonathan Lewis siger ikke eksplicit, at de er deterministiske, men han nævner, at ORA_HASH
"synes at være den funktion, der bruges internt - med et nul-seed - til at bestemme, hvilken partition en række tilhører i en hash-partitioneret tabel". Og hvis det bruges til hash-partitionering, skal det være deterministisk, ellers ville partitionsmæssige joinforbindelser ikke fungere.
For at vise den ORA_HASH
kan være ikke-deterministisk for nogle datatyper, kør nedenstående forespørgsel. Det er fra en kommentar i samme artikel:
with src as (select to_clob('42') val from dual connect by level<=5)
select val,ora_hash(val,7) from src order by 2;
Overraskende nok sker de samme problemer med dbms_sqlhash.gethash
.