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

Come implementare ora_hash (hash seminabile che divide qualsiasi tipo di dati sql in n bucket)

Credo che tu stia parlando di una perfetta funzione hash. La funzione ORA_HASH di Oracle non è una funzione hash perfetta.

http://en.wikipedia.org/wiki/Perfect_hash_function

Il più vicino possibile a ciò che sembri volere è un array associativo. Oracle ha quelli. Inizia a giocare con questo esempio:

set serverout on size 10000
DECLARE
cursor foo 
is 
  select distinct fld1,fld2,fld9  from sometable;

type t is table of foo.%ROWTYPE
  index by varchar2;   -- change the index to an int if you want

myarray t; -- myarray is a table of records -- whatever foo returns

BEGIN
  for x in foo
  loop
      -- index using the first column of the fetched row  "fld1":
      myarray(x.fld1)=x;  -- assign the rowtype to the table of records.      
  end loop;

END;
/  

Nota:un array associativo è costruito su una tabella hash, l'esempio sopra usa fld1 come chiave hash. Quindi quanto sopra funzionerà solo se come descrivi, hashing perfetto, se e solo se fld1 è un campo univoco. Questo è ciò che i distinti là dentro devono fare. Non è mai sempre richiesto.