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>
如您所见,从签名与表项目匹配的嵌套表中插入记录很简单 .
此外,如果记录实际匹配现有表,我们可以使用%ROWTYPE语法声明嵌套表 .
1 declare
2 type nt_emp temp_emp%rowtype;
3 emp_recs nt_emp;
4 begin
2 回答
不确定为什么你在批量收集方面遇到麻烦:它非常简单 . 当我们处理数以万计的记录时,它会变得稍微困难一点,但是你没有说这是否是一个因素 . 无论哪种方式,您都不需要使用带有批量收集的扩展 .
如您所见,从签名与表项目匹配的嵌套表中插入记录很简单 .
此外,如果记录实际匹配现有表,我们可以使用%ROWTYPE语法声明嵌套表 .
Bulk Collect和Forall比正常的RBAR实现更有效,但与纯SQL相比它们仍然缓慢 . 所以通常我们只会使用这种构造,我们正在对数组进行一些中间数据操作,这本身不能在SQL中完成 . 随着Oracle的SQL功能随着每个版本的增加而增加,发现这种需求变得越来越少 .
您可以使用BULK COLLECT填充数组(或者在pl / sql表中填充数据) .
因此:
查看文档@ http://docs.oracle.com/cd/B10501_01/appdev.920/a96624/05_colls.htm,它在过去对我来说非常方便 . (这也将回答你关于EXTEND的问题)
如果这不是您想要的,请发布一个代码段来帮助解决问题 .