Sea*_*aux 13 oracle plsql associative-array
我试图在一个查询中选择数据到pl/sql关联数组.我知道我可以使用硬编码密钥执行此操作,但我想看看是否有某种方法可以引用另一列(键列).
DECLARE
TYPE VarAssoc IS TABLE OF varchar2(2) INDEX BY varchar2(3);
vars VarAssoc;
BEGIN
SELECT foo, bar INTO vars(foo) FROM schema.table;
END;
Run Code Online (Sandbox Code Playgroud)
我得到一个错误,说当我这样做时必须声明foo.有没有办法在单个查询中创建我的关联数组,还是需要回退到FOR循环?
Dav*_*sta 17
刚看完你对APC答案的评论,听起来你自己想出来了.但我想我无论如何都要为未来的搜索者提供答案.
这是更简单的代码,但没有使用BULK COLLECT的速度优势.只需遍历查询返回的行,并分别设置关联数组中的元素.
DECLARE
TYPE VarAssoc IS TABLE OF varchar2(200) INDEX BY varchar2(30);
vars VarAssoc;
BEGIN
FOR r IN (SELECT table_name,tablespace_name FROM user_tables) LOOP
vars(r.table_name) := r.tablespace_name;
END LOOP;
dbms_output.put_line( vars('JAVA$OPTIONS') );
END;
Run Code Online (Sandbox Code Playgroud)
如果可能的话,这将是整洁的,但这不是一种直接的方式来实现这一点.
我们可以做的是将数据加载到常规PL/SQL集合中,然后将其加载到关联数组中.虽然这比围绕桌子循环更快是一件大事:除非我们处理大量数据,否则它可能无关紧要.
鉴于此测试数据......
SQL> select * from t23
2 order by c1
3 /
C1 C2
-- ---
AA ABC
BB BED
CC CAR
DD DYE
EE EYE
ZZ ZOO
6 rows selected.
SQL>
Run Code Online (Sandbox Code Playgroud)
...我们可以通过两个步骤填充关联数组:
SQL> set serveroutput on
SQL>
SQL> declare
2 type varassoc is table of varchar2(3) index by varchar2(2);
3 vars varassoc;
4
5 type nt is table of t23%rowtype;
6 loc_nt nt;
7
8 begin
9 select * bulk collect into loc_nt from t23;
10 dbms_output.put_line('no of recs = '||sql%rowcount);
11
12 for i in loc_nt.first()..loc_nt.last()
13 loop
14 vars(loc_nt(i).c1) := loc_nt(i).c2;
15 end loop;
16
17 dbms_output.put_line('no of vars = '||vars.count());
18
19 dbms_output.put_line('ZZ = '||vars('ZZ'));
20
21 end;
22 /
no of recs = 6
no of vars = 6
ZZ = ZOO
PL/SQL procedure successfully completed.
SQL>
Run Code Online (Sandbox Code Playgroud)
真正的问题可能是填充关联数组是否比仅选择表中的行更好.当然,如果你有11g企业版,你应该考虑结果集缓存.
| 归档时间: |
|
| 查看次数: |
70877 次 |
| 最近记录: |