使用Oracle PL/SQL集合

Yar*_*oze 1 oracle collections plsql

我需要实现的目标是将游标中的所有记录都集成到一个集合中,以使用该游标中的数据填充表.不幸的是,我无法理解如何将数据从光标提取到数组中.我已尝试过批量收集,但没有办法.extend关键字是什么意思?

最后我如何从该阵列获取数据?

我首先声明了所需字段的记录.然后,我创建了一个这种类型的表.然后我批量收集从光标到表格的所有内容.它似乎工作但现在如何从该表中获取数据?

APC*_*APC 5

不确定为什么你在批量收集方面遇到麻烦:它非常简单.当我们处理数以万计的记录时,它会变得稍微困难​​一点,但是你没有说这是否是一个因素.无论哪种方式,您都不需要使用带有批量收集的扩展.

SQL> SQL> SQL> ed
Wrote file afiedt.buf

  1  declare
  2      type r_tmp is record
  3          ( empno number
  4            , deptno number
  5            , sal number );
  6      type nt_emp is table of r_tmp;
  7      emp_recs nt_emp;
  8  begin
  9      select e.empno
 10             , e.deptno
 11             , e.sal
 12      bulk collect into emp_recs
 13      from emp e;
 14      dbms_output.put_line('no of recs selected = '||emp_recs.count );
 15      forall i in emp_recs.first..emp_recs.last
 16          insert into temp_emp
 17          values emp_recs(i);
 18      dbms_output.put_line('no of recs inserted = '||sql%rowcount );
 19* end;
 20  /
no of recs selected = 17
no of recs inserted = 17

PL/SQL procedure successfully completed.

SQL> 
Run Code Online (Sandbox Code Playgroud)

如您所见,从签名与表项目匹配的嵌套表中插入记录很简单.

此外,如果记录实际匹配现有表,我们可以使用%ROWTYPE语法声明嵌套表.

  1  declare
  2      type nt_emp temp_emp%rowtype;
  3      emp_recs nt_emp;
  4  begin
Run Code Online (Sandbox Code Playgroud)

Bulk Collect和Forall比正常的RBAR实现更有效,但与纯SQL相比它们仍然缓慢.所以通常我们只会使用这种构造,我们正在对数组进行一些中间数据操作,这本身不能在SQL中完成.随着Oracle的SQL功能随着每个版本的增加而增加,发现这种需求变得越来越少.