使用Oracle PL/SQL集合

使用Oracle PL/SQL集合,oracle,collections,plsql,Oracle,Collections,Plsql,我需要实现的目标是将游标中的所有记录放入一个集合中,用该游标中的数据填充一个表。 不幸的是,我无法理解如何将数据从游标提取到数组中。 我试过批量收集,但没有办法。 extend关键字是什么意思 最后,如何从该数组中获取数据 我首先声明了一个包含所需字段的记录。然后,我创建了一个这种类型的表。然后我批量收集从光标到表格的所有内容。这似乎有效,但现在我如何从该表中获取数据 您可以使用批量收集来填充数组或at pl/sql记录表。 因此: 查看文档@,它在过去对我来说非常有用。这也将回答您关于扩展的问

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

最后,如何从该数组中获取数据


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

您可以使用批量收集来填充数组或at pl/sql记录表。 因此:

查看文档@,它在过去对我来说非常有用。这也将回答您关于扩展的问题


如果这不是您想要的,请发布一段代码片段来帮助解决问题。

您可以使用批量收集来填充数组或at pl/sql记录表。 因此:

查看文档@,它在过去对我来说非常有用。这也将回答您关于扩展的问题


如果这不是您想要的,请发布一个代码片段来帮助解决问题。

不确定为什么批量收集会有问题:这非常简单。当我们处理数以万计的记录时,它会变得稍微困难一些,但你不能说这是否是一个因素。无论哪种方式,您都不需要将extend与批量收集一起使用

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

大容量收集和Forall比普通RBAR实现更高效,但与纯SQL相比,它们仍然比较迟缓。因此,通常我们只会使用这种构造,因为我们正在对数组进行一些中间数据操作,而这本身不能在SQL中完成。随着Oracle的SQL功能随着每个版本的增加而增加,找到这样的需求变得越来越少。

不确定为什么批量收集会遇到问题:这非常简单。当我们处理数以万计的记录时,它会变得稍微困难一些,但你不能说这是否是一个因素。无论哪种方式,您都不需要将extend与批量收集一起使用

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

大容量收集和Forall比普通RBAR实现更高效,但与纯SQL相比,它们仍然比较迟缓。因此,通常我们只会使用这种构造,因为我们正在对数组进行一些中间数据操作,而这本身不能在SQL中完成。随着Oracle的SQL功能随着每个版本的增加而增加,发现这样的需求变得越来越少。

是否有理由选择将数据放入数组以将其放入表中?您可以将光标的结果直接插入到表中,理想情况下使用insert-into。。。从…中选择。。。我同意Stephen ODonnell的观点,直接使用SQL插入行比使用PL/SQL游标效率更高。请参阅,是否有理由选择数组中的数据以将其放入表中?您可以将光标的结果直接插入到表中,理想情况下使用insert-into。。。从…中选择。。。我同意Stephen ODonnell的观点,直接使用SQL插入行比使用PL/SQL游标效率更高。再见,非常感谢!!!你的解决方案100%有效!就像你解释的那样,我听上去很清楚D你好,佩德罗谢谢你!!!你的解决方案100%有效!就像你解释的那样,我听上去很清楚D你好,佩德罗