2013-09-27 37 views
5

Oracle pl/sql中有一種方法可以創建數據結構,如Java Hashmap,它可以具有記錄類型作爲值和String作爲索引。PL/SQL數據結構像Hashmap

例如;

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; 

我想能夠做到以下

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

才能實現這一目標? 我不能使用嵌套表,因爲我只能通過整數索引它。 對於關聯數組,我不能使用對象類型作爲屬性。

也想這樣做,而不必創建一個對象或模式數據類型。 你能提出一些建議嗎?

+3

你已經在你的榜樣答案。小修改。不是'索引',而是'索引',你很好走。 –

回答

12

在PL/SQL你可以定義associative arrays通過VARCHAR2索引(因爲10克我認爲):

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 

在內部,我覺得結構更像是一個二叉樹地圖比HashMap中。

當然,你可以存儲PL/SQL記錄或者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

是的,但我需要將記錄類型存儲爲值,而不是使用關聯數組可以實現的VARCHAR2.Can? – Rohan

+1

@rohan當然=) –

+0

如何在第一個示例中遍歷變量l。 – viveksinghggits