java调用Oracle存储过程返回二维数组

以下代码仅仅记录整个过程。  
1.在数据库中新建两个类型,分别是:  
Java代码    收藏代码
  1. create or replace type type_record is object(  
  2.   name    varchar2(200),  
  3.   ymonth    varchar2(2000)  
  4. );  
  5. create or replace type type_array is table of type_record;  


2.存储过程:  
Java代码    收藏代码
  1. create or replace procedure proc_records(p_start in varchar, p_end in varchar, p_records out type_array)  
  2. as  
  3.   type cur_type is ref cursor;  
  4.   startDate date;  
  5.   endDate   date;  
  6.   querysql  varchar2(4000);  
  7.   subquerysql varchar2(400);  
  8.   v_cursor cur_type;  
  9.   cursor r_cursor is select tr.ymonth,tr.name from tb_record tr where tr.id=-1;  
  10.   rec_purch r_cursor%rowtype;  
  11.   v_record type_record;  
  12.   v_status number;  
  13. begin  
  14.   startDate:=to_date(p_start,'yyyymm');  
  15.   endDate:=to_date(p_end,'yyyymm');  
  16.   while startDate <= endDate loop  
  17.     begin  
  18.       subquerysql:='select ' || to_number(to_char(startDate,'yyyymm')) ||' as ymonth, tp.name from tb_service tp where exists (' ||  
  19.                    'select tr.name from tb_record tr where tr.ymonth=' || to_number(to_char(startDate,'yyyymm')) ||' and tr.name=tp.name)';  
  20.       querysql:='' || querysql || ' union all ' || subquerysql;  
  21.       startDate:=add_months(startDate, 1);  
  22.     end;  
  23.   end loop;  
  24.   p_records:=type_array();  
  25.   open v_cursor for substr(querysql, 11);  
  26.   loop  
  27.     fetch v_cursor into rec_purch;  
  28.     exit when v_cursor%notfound;    
  29.       p_records.extend;  
  30.       p_records(p_records.count):=type_record(rec_purch.name,rec_purch.ymonth||',');  
  31.   end loop;  
  32.   dbms_output.put_line(p_records.count);  
  33.   close v_cursor;  
  34. end;  


三、java调用主要代码片段:  
Java代码    收藏代码
  1. String call = "{ call proc_records(?,?,?,?)}";  
  2. con = DBConnectionFactory.getConfigConnection();  
  3. /**注意这里由于是从java.sql.Connection中执行prepareCall方法,可以直接拿到数据库驱动的实际Connection,如果使用其它框架如:hibernate、ibatis、dbcp之类的,需要先获取底层Connection,下面的代码才能正常的类型转换。 
  4. */  
  5. cstmt = (OracleCallableStatement)con.prepareCall(call);  
  6. cstmt.setString(1"201210");  
  7. cstmt.setString(2"201304");  
  8. //注册返回参数为oracle的数组类型,注意类型名称要大写  
  9. cstmt.registerOutParameter(3,  
  10. leTypes.ARRAY, "TYPE_ARRAY");  
  11. cstmt.execute();  
  12.           
  13. ARRAY array = cstmt.getARRAY(3);  
  14. Datum[] datas = array.getOracleArray();  
  15. if (datas.length > 0) {  
  16.     for (int i = 0; i < datas.length; i++) {  
  17.     if (datas[i] != null && ((STRUCT) datas[i]) != null) {  
  18.      //注意此处返回的Datum元素为byte类型,需要重新包装一下,如new String  
  19. um[] dataAttr = ((STRUCT) datas[i])                     .getOracleAttributes();  
  20.         System.out.println("column" + (i + 1) + ":"         + new String(dataAttr[0].getBytes()) + ",  "  
  21. ew String(dataAttr[1].getBytes()));  
  22.     } else {  
  23.      System.out.println("datas[" + i + "] is null.");  
  24.     }  
  25.     }  
  26. else {  
  27.      System.out.println("this procedure is not result data...");  
  28. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值