ORA_HASH
je rozhodně deterministický pro datové typy, které lze použít k rozdělení, jako je NUMBER, VARCHAR, DATE atd.
Ale ORA_HASH
není deterministický pro alespoň některé další datové typy, jako je CLOB.
Moje odpověď je založena na tomto
Článek Jonathana Lewise o ORA_HASH
.
Jonathan Lewis výslovně neříká, že jsou deterministické, ale zmiňuje, že ORA_HASH
"zdá se, že je to funkce používaná interně - s nulovým počátečním číslem - k určení, do kterého oddílu patří řádek v tabulce rozdělené hash". A pokud se používá pro rozdělování hash, musí být deterministické, jinak by spojení po oddílech nefungovalo.
Chcete-li ukázat, že ORA_HASH
může být pro některé datové typy nedeterministické, spusťte níže uvedený dotaz. Je to z komentáře ve stejném článku:
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;
Překvapivě ke stejným problémům dochází u dbms_sqlhash.gethash
.