2013-09-27 9 views
5

Czy jest jakiś sposób w Oracle pl/sql, że mogę utworzyć strukturę danych, taką jak Java Hashmap, która może mieć typ rekordu jako wartość, a String jako indeks.Baza danych PL/SQL, taka jak Hashmap

Na przykład;

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; 

Chciałbym móc to zrobić poniżej

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

można to osiągnąć? Nie mogę używać tabel zagnieżdżonych, ponieważ mogę tylko indeksować je według liczby całkowitej. W przypadku tablic asocjacyjnych nie można używać typu obiektu jako atrybutów.

Również chciałbyś to zrobić bez konieczności tworzenia obiektu lub typu danych schematu. Czy możesz coś zasugerować?

+3

Masz już odpowiedź w swoim przykładzie. Drobna korekta. Nie "indeksowane przez", ale raczej "indeksuj według" i jesteś dobry. –

Odpowiedz

12

W PL/SQL można zdefiniować associative arrays indeksowane przez VARCHAR2 (od 10g myślę):

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 

Wewnętrznie, myślę, że struktura jest bardziej jak mapa binarnego drzewa niż w hashmap.

Oczywiście można przechowywać zapisy PL/SQL lub obiektów 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

Tak, ale muszę przechowywać typ rekordu jako wartość zamiast VARCHAR2.Can, które można osiągnąć przy użyciu tablic asocjacyjnych? – Rohan

+1

@rohan Oczywiście =) –

+0

jak mogę iterować przez zmienną lw pierwszym przykładzie. – viveksinghggits