sql >> Database >  >> RDS >> Oracle

Hoe ora_hash te implementeren (zaaibare hash die elk sql-gegevenstype in n buckets verdeelt)

Ik geloof dat je het hebt over een perfecte hash-functie. De ORA_HASH-functie van Oracle is geen perfecte hash-functie.

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

Zo dicht als je komt bij wat je lijkt te willen, is een associatieve array. Oracle heeft die. Begin te spelen met dit voorbeeld:

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

Opmerking:een associatieve array is gebouwd op een hashtabel, het bovenstaande voorbeeld gebruikt fld1 als de hash-sleutel. Dus het bovenstaande werkt alleen als, zoals u beschrijft, perfecte hashing, als en alleen als fld1 een uniek veld is. Dat is wat de onderscheiden daarbinnen te doen. Het is nooit altijd nodig.




  1. MySql-tabellen, fout #1064 &fout #1068 Meerdere primaire sleutels gedefinieerd

  2. Postgresql toevoegen aan mijn Heroku-app - problemen met syntaxis-crashes?

  3. Vreemde sleutel naar niet-primaire sleutel

  4. ORA-14551:kan geen DML-bewerking uitvoeren binnen een query