2013-09-27 8 views
5

C'è un modo in Oracle pl/sql che posso creare un datastructure come java Hashmap che può avere un tipo di record come valore e String come indice.PL/SQL datastructure come Hashmap

Ad esempio;

type emp_rec_type is record (emp_id number,emp_salary number); 
emp_rec emp_rec_type; 

type emp_assoc_array is table of emp_rec_type indexed by varchar2(30); 
emp_map emp_assoc_array; 

mi piacerebbe essere in grado di fare il seguito

emp_rec.emp_id := 1; 
    emp_rec.salary := 1000; 
    emp_map('Rohan') := emp_rec; 

Può questo essere raggiunto? Non riesco a usare le tabelle annidate poiché posso indicizzarlo solo da numero intero. Con gli array associativi, non posso usare il tipo di oggetto come attributi.

Vorrebbe anche farlo senza dover creare un tipo di dati oggetto o schema. Potete suggerire qualcosa?

+3

Hai già la risposta nel tuo esempio. Correzione minore Non "indicizzato da" ma piuttosto "indicizzato da" e tu sei pronto per partire. –

risposta

12

in PL/SQL è possibile definire associative arrays indicizzato da VARCHAR2 (dal 10 g credo):

SQL> DECLARE 
    2  TYPE map_varchar IS TABLE OF VARCHAR2(30) INDEX BY VARCHAR2(30); 
    3  l map_varchar; 
    4 BEGIN 
    5  l('A') := 'alpha'; 
    6  l('B') := 'beta'; 
    7  dbms_output.put_line(l('A')); 
    8 END; 
    9/

alpha 

Internamente, penso che la struttura è più simile a una mappa binaria-albero che un hashmap.

Naturalmente è possibile archiviare i record PL/SQL o oggetti SQL:

SQL> DECLARE 
    2  TYPE emp_rec_type IS RECORD (emp_id NUMBER,emp_salary NUMBER); 
    3  TYPE map_varchar IS TABLE OF emp_rec_type INDEX BY VARCHAR2(30); 
    4  l_emp emp_rec_type; 
    5  l_map map_varchar; 
    6 BEGIN 
    7  l_emp.emp_id := 1; 
    8  l_emp.emp_salary := 1000; 
    9  l_map('A') := l_emp; 
10  -- you can also affect record values directly 
11  l_map('B').emp_id := 2; 
12  l_map('B').emp_salary := 2000; 
13  dbms_output.put_line(l_map('A').emp_salary); 
14 END; 
15/

1000 

PL/SQL procedure successfully completed 
+0

Sì, ma è necessario archiviare il tipo di record come valore anziché VARCHAR2. Può essere ottenuto utilizzando gli array associativi? – Rohan

+1

@rohan Ovviamente =) –

+0

come posso scorrere la variabile l nel tuo primo esempio .. – viveksinghggits