Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So verwenden Sie ora_hash für eine Spalte des Datentyps xmltype

Wie Sie bereits wissen, ora_hash akzeptiert long nicht oder LOB-Werte. Sie könnten die ersten 4 KB oder 32 KB des XML-Inhalts übergeben, aber wenn Sie sicherstellen müssen, dass sich das gesamte XML-Dokument nicht geändert hat, reicht das nicht aus. Und wie Ben erwähnt hat, ora_hash hat maximal 4294967295 Buckets, daher sind Kollisionen eher wahrscheinlicher als bei SHA-1 oder MD5. Wie die Dokumentation sagt, ora_hash 'ist nützlich für Vorgänge wie die Analyse einer Teilmenge von Daten und die Generierung einer Zufallsstichprobe'.

Sie können den dbms_crypto verwenden Paket, um den gesamten XMLType-Wert als CLOB zu hashen, das mit getClobVal extrahiert wurde Funktion, mit einer Wrapper-Funktion, um die Verwendung zu vereinfachen:

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;
/

Sie können dann Ihren XMLType als Wert oder als Spalte als Teil eines select:

übergeben
select my_hash(xml) from t42;

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