ORA_HASH
определено е детерминиран за типове данни, които могат да се използват за разделяне, като NUMBER, VARCHAR, DATE и т.н.
Но ORA_HASH
ене детерминистичен за поне някои от другите типове данни, като CLOB.
Отговорът ми се основава на това
Статия на Джонатан Люис за ORA_HASH
.
Джонатан Луис не казва изрично, че са детерминистични, но споменава, че ORA_HASH
"изглежда, че е функцията, използвана вътрешно – с нулево семе – за определяне към кой дял принадлежи ред в хеш-разделена таблица". И ако се използва за хеш разделяне, тогава трябва да е детерминистично, в противен случай съединяванията по дялове няма да работят.
За да покаже, че ORA_HASH
може да бъде недетерминиран за някои типове данни, изпълнете заявката по-долу. Това е от коментар в същата статия:
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;
Изненадващо, същите проблеми се случват с dbms_sqlhash.gethash
.