PL/SQL:从表中选择一个关联数组

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)


APC*_*APC 6

如果可能的话,这将是整洁的,但这不是一种直接的方式来实现这一点.

我们可以做的是将数据加载到常规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企业版,你应该考虑结果集缓存.