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