当前位置:首页 > 开发 > 系统架构 > 架构 > 正文

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

发表于: 2013-03-15   作者:Dead_knight   来源:转载   浏览次数:
摘要: 以下代码仅仅记录整个过程。 1.在数据库中新建两个类型,分别是: create or replace type type_record is object( name varchar2(200), ymonth varchar2(2000) ); create or replace type type_array is table of type_recor
以下代码仅仅记录整个过程。
1.在数据库中新建两个类型,分别是:
create or replace type type_record is object(
  name    varchar2(200),
  ymonth    varchar2(2000)
);
create or replace type type_array is table of type_record;


2.存储过程:
create or replace procedure proc_records(p_start in varchar, p_end in varchar, p_records out type_array)
as
  type cur_type is ref cursor;
  startDate date;
  endDate   date;
  querysql  varchar2(4000);
  subquerysql varchar2(400);
  v_cursor cur_type;
  cursor r_cursor is select tr.ymonth,tr.name from tb_record tr where tr.id=-1;
  rec_purch r_cursor%rowtype;
  v_record type_record;
  v_status number;
begin
  startDate:=to_date(p_start,'yyyymm');
  endDate:=to_date(p_end,'yyyymm');
  while startDate <= endDate loop
    begin
      subquerysql:='select ' || to_number(to_char(startDate,'yyyymm')) ||' as ymonth, tp.name from tb_service tp where exists (' ||
                   'select tr.name from tb_record tr where tr.ymonth=' || to_number(to_char(startDate,'yyyymm')) ||' and tr.name=tp.name)';
      querysql:='' || querysql || ' union all ' || subquerysql;
      startDate:=add_months(startDate, 1);
    end;
  end loop;
  p_records:=type_array();
  open v_cursor for substr(querysql, 11);
  loop
    fetch v_cursor into rec_purch;
    exit when v_cursor%notfound;  
      p_records.extend;
      p_records(p_records.count):=type_record(rec_purch.name,rec_purch.ymonth||',');
  end loop;
  dbms_output.put_line(p_records.count);
  close v_cursor;
end;


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

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

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
数据库返回的是结果集,存储过程返回的是一个或者多个值,所以不要使用while循环去读取,也不要使用
----创建的存储过程 create or replace procedure addTest(v1 in number, v2 in number,res out num
最近在用ibatis.net框架和oracle 11g开发一套程序。其中有一个需求就是通过存储过程,查询指定条件
Microsoft Enterprise Library中所带的Data Access Application Block(以下简称DAAB),对ADO.NET进
在Oracle开发过程中,经常会遇到各种形式的报表展示,有些报表用sql语句直接是写不出来的,需要程序
Crystal Report 8非常易入门,通常只需要鼠标就可以完成报表的创建,但随着实习中对SQL语言和底层数
1、定义一个程序包 create or replace package pag_q is type cur_result is ref cursor; end pag_q
创建有参存储函数findEmpNameAndSal(编号),查询7902号员工的的姓名和月薪,【返回多个值,演示out
本文来自CSDN博客http://blog.csdn.net/liushengmz/archive/2010/04/29/5541986.aspx 问题:在存储过
一、题目要求 输入一个二维整形数组,数组里有正数也有负数。 二维数组首尾相接,象个一条首尾相接
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号