ORA_HASH
is zeker bepalend voor gegevenstypen die kunnen worden gebruikt voor partitionering, zoals NUMBER, VARCHAR, DATE, enz.
Maar ORA_HASH
is niet deterministisch voor ten minste enkele van de andere gegevenstypen, zoals CLOB.
Mijn antwoord is gebaseerd op dit
Jonathan Lewis-artikel over ORA_HASH
.
Jonathan Lewis zegt niet expliciet dat ze deterministisch zijn, maar hij vermeldt wel dat ORA_HASH
"lijkt de functie die intern wordt gebruikt - met een nul seed - om te bepalen tot welke partitie een rij behoort in een hash-gepartitioneerde tabel". En als het wordt gebruikt voor hash-partitionering, moet het deterministisch zijn, anders zouden partitie-gewijze joins niet werken.
Om te laten zien dat ORA_HASH
voor sommige gegevenstypen niet-bepalend kan zijn, voert u de onderstaande query uit. Het komt uit een opmerking in hetzelfde 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;
Verrassend genoeg doen zich dezelfde problemen voor met dbms_sqlhash.gethash
.