首页 文章

使用Oracle PL / SQL集合

提问于
浏览
1

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

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

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

2 回答

  • 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>
    

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

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

    1  declare
      2      type nt_emp temp_emp%rowtype;
      3      emp_recs nt_emp;
      4  begin
    

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

  • 4

    您可以使用BULK COLLECT填充数组(或者在pl / sql表中填充数据) .
    因此:

    set serveroutput on
    declare
      type xyz is record(colA number ,
                         colB Date) ;
      type xyz_table is table of xyz;
    
      p_xyz_table xyz_table ;
    
    begin
        select level, sysdate+level 
               bulk collect into p_xyz_table
          from dual
          connect by level < 15 ;
          dbms_output.put_line('records=>' || p_xyz_table.count);
          FOR i IN  1 .. p_xyz_table.COUNT LOOP
              dbms_output.put_line(' colA=> ' || p_xyz_table(i).colA || '; colB=>' || p_xyz_table(i).colB);
          end loop ;
    end ;
    /
    
    results:
    records=>14
     colA=> 1; colB=>23/11/11 09:20:00
     colA=> 2; colB=>24/11/11 09:20:00
     colA=> 3; colB=>25/11/11 09:20:00
     colA=> 4; colB=>26/11/11 09:20:00
     colA=> 5; colB=>27/11/11 09:20:00
     colA=> 6; colB=>28/11/11 09:20:00
     colA=> 7; colB=>29/11/11 09:20:00
     colA=> 8; colB=>30/11/11 09:20:00
     colA=> 9; colB=>01/12/11 09:20:00
     colA=> 10; colB=>02/12/11 09:20:00
     colA=> 11; colB=>03/12/11 09:20:00
     colA=> 12; colB=>04/12/11 09:20:00
     colA=> 13; colB=>05/12/11 09:20:00
     colA=> 14; colB=>06/12/11 09:20:00
    

    查看文档@ http://docs.oracle.com/cd/B10501_01/appdev.920/a96624/05_colls.htm,它在过去对我来说非常方便 . (这也将回答你关于EXTEND的问题)

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

相关问题