以下代码仅仅记录整个过程。
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...");
}
分享到:
相关推荐
在c++中,经常调用函数,而子函数经常要返回的值是数组,无论一维数组还是二维数组都需要运用到指针的知识。一维数组不再过多叙述,给了一个实例如何返回二维数组,希望对大家有帮助(主要用到指针的知识,看不懂的...
JNA调用C++动态库,传入二维数组,通过C++返回二维数组,java调用C++完整案例
c#调用c++DLL,DLL里是二维数组 ,c#里如何调用二维数组
java调用oracle存储过程返回结果集,Record,cursor参照.pdf
C#中调用oracle存储过程返回数据集
java调用oracle存储过程或者函数
通过实例详细介绍了用java调用oracle存储过程的方法和步骤,包括无返回值的存储过程、有返回值的存储过程(非列表)和返回列表的存储过程的编写、JAVA调用,是一个对存储过程调用的一个全面总结,对程序开发具体实际...
java调用存储过程返回数组 学习下 对你会有不小的帮助
通过输出九九乘法表,学习在Delphi中静态二维数组的使用方法。
java调用oracle存储过程实现增删改查
java调用oracle输出参数为多行多列的结构化数组的存储过程,并将其遍历解析;该demo部署后,只需要配置poolman.xml数据源,即可运行;
Java调用oracle存储过程
讲有关java如何调用ORACLE存储过程以及游标使用,它只包含JAVA调用ORACLE存储过程游标使用(上),还有JAVA调用ORACLE存储过程游标使用(上),
JAVA中调用Oracle存储过程 JAVA中调用Oracle存储过程 JAVA中调用Oracle存储过程 JAVA中调用Oracle存储过程 JAVA中调用Oracle存储过程
NULL 博文链接:https://fruitking.iteye.com/blog/1447333
java调用oracle存储过程.wps java调用oracle存储过程.wps java调用oracle存储过程.wps
动态创建指针数组,将指针数组作为实参调用形参为二维数组的函数。
本文用一个案例系统的介绍了怎样用java调用oracle存储过程
java调用oracle存储过程入门实例 增删改查 使用dom4j读取数据库的配置文件(xml) jdbc中connection的管理 使用threadlocal
Java调用Oracle存储过程的方法