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

Come usare ora_hash su una colonna di tipo di dati xmltype

Come già sai, ora_hash non accetta long o valori LOB. Potresti passare i primi 4k o 32k del contenuto XML, ma se hai bisogno di assicurarti che l'intero documento XML non sia cambiato, ciò non sarà sufficiente. E come ha detto Ben, ora_hash ha un massimo di 4294967295 bucket, quindi le collisioni sono piuttosto più probabili rispetto a SHA-1 o MD5. Come dice la documentazione, ora_hash 'è utile per operazioni come l'analisi di un sottoinsieme di dati e la generazione di un campione casuale'.

Puoi usare il dbms_crypto pacchetto per eseguire l'hashing dell'intero valore XMLType, come CLOB estratto con getClobVal funzione, con una funzione wrapper per semplificarne l'utilizzo:

create or replace function my_hash(xml xmltype) return raw is
begin
  return dbms_crypto.hash(src=>xml.getclobval(), typ=>dbms_crypto.hash_sh1);
end;
/

Puoi quindi passare il tuo XMLType, come valore o come colonna come parte di una selezione:

select my_hash(xml) from t42;

MY_HASH(XML)                                 
---------------------------------------------
494C4E7688963BCF312B709B33CD1B5CCA7C0289