`
dacoolbaby
  • 浏览: 1268955 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Oracle集合类

阅读更多

首先,简单描述一下今天使用DBMS_OUTPUT.PUTLINE();的问题。

这个output只能支持1000 bytes的数据量。

如果超过这个数据量,就会报ORU-10027 buffer overflow,limit of 10000 bytes错误 。

 

如果你真的需要输出那么多的数据,请使用:

   set serveroutput on size 100000

我们在使用Java或者其他高级语言的时候,常常会用到一个东西,叫做数组。

而在Oracle数据库的存储过程和函数中,是无法使用DDL语句,也就是无法自由使用临时表,保存暂存数据。

 

但是,在Oracle有个很好的解决方案:

type xxx is table of xxx index by binary_integer

 

示例:

create or replace procedure sp_tes2
as
    type t_serv_tbl is table of itmis_pri_serv_tbl%rowtype index by binary_integer;
    v_servs t_serv_tbl ;
begin

  begin  
      SELECT * BULK COLLECT INTO v_servs FROM itmis_pri_serv_tbl where year=2013
            ; 
  for i in 1..v_servs.count  
  loop   
    dbms_output.put_line(v_servs(i).serv_id || '---' || v_servs(i).serv_name);   
  end loop;   
  end;
  
    close cur_calling;
          
end;	

 

这里需要注意2点:

1. 在declare部分,要先声明一个TYPE。

2. 在使用这个TYPE之前,需要将其实例化,如上面的 v_servs t_serv_tbl

 

在这里我们使用了一个BULK COLLECT 这个语句。稍微介绍一下:

通过bulk collect减少loop处理的开销。
采用bulk collect可以将查询结果一次性地加载到collections中。
而不是通过cursor一条一条地处理。

BULK COLLECT只支持集合类型的数据。

 

当然我们也可以只针对一个字段建立一个集合,如:

create or replace procedure sp_tes2
as
    TYPE t_serv_name IS TABLE OF itmis_pri_serv_tbl.serv_name%TYPE; 
    v_t_serv_name t_serv_name; 
begin
  begin  
      SELECT * BULK COLLECT INTO v_servs FROM itmis_pri_serv_tbl where year=2013
            ; 
   for i in 1..v_t_serv_name.count  
  loop   
    dbms_output.put_line(v_t_serv_name(i));   
  end loop;   
  end;  
    close cur_calling;          
end;	
	

 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics