在Oracle pl / sql中是否有一种方法可以创建像Java Hashmap这样的数据结构,它可以将记录类型作为值,将String作为索引。
例如;
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;
这可以实现吗? 我不能使用嵌套表,因为我只能用整数索引它。 对于关联数组,我不能将对象类型用作属性。
也希望在不必创建对象或模式数据类型的情况下执行此操作。 你能建议吗?
答案 0 :(得分:16)
在PL / SQL中,您可以定义由VARCHAR2
索引的associative arrays(我认为是10g):
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
在内部,我认为结构更像是二进制树映射而不是散列映射。
当然,您可以存储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