以下代码仅仅记录整个过程。
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存储过程,并输出自定义对象或二维表,以此提升数据处理效率。 首先,我们需要理解Java与Oracle数据库的连接方式。Java通过JDBC(Java Database Connectivity)API来实现对...
根据给定的信息,本文将详细解释如何在Java中通过调用存储过程实现带有自定义对象作为参数的大批量数据处理,并且特别关注了入参为二维数组的批量插入以及出参为自定义对象(二维数组)的情况。此外,还将讨论与...
在实际开发过程中,当需要返回复杂的数据结构,如二维数组或结果集时,可以通过存储过程中使用集合数据结构来实现。 #### 2. PL/SQL存储过程及Java程序的编写 ##### 2.1 索引表作为输出参数 索引表是一种非常灵活...
Oracle集合类型输出参数的PL/SQL存储过程及Java调用主要涉及如何在Oracle数据库中使用存储过程处理集合数据,并在Java应用中调用这些过程。本文档介绍了一种使用索引表作为输出参数的方法,以及如何在Java中处理返回...
5. **多维数组**:Java还支持多维数组,如二维数组,可表示矩阵或其他类似结构。例如,`int[][] matrix = new int[3][4];` 6. **数组操作方法**:Java的`Arrays`类提供了一些实用方法,如排序(`sort()`)、复制(`...
通过这种方式,Java程序创建一个包含100个元素的二维数组,每个元素代表一条要插入的数据,然后将其转换为Oracle数组类型,并传递给存储过程执行批量插入。 调用存储过程的好处在于,它减少了与数据库的交互次数,...
TABLE类型则更加灵活,它可以看作是一个可变大小的二维表格,可以存储不同类型的数据。这两种类型在处理大量数据时尤其有用,因为它们允许一次性提交多条记录,而不是一条一条地执行插入操作。 要使用Java操作...
在本课程的“数组(下)”部分,讲解了二维数组和多维数组的概念。二维数组可以看作是一组一维数组的集合,常用于处理表格数据。声明二维数组的方式是`类型[][] 数组名`。创建和初始化二维数组可以像这样: ```java...
- 多维数组:如二维数组,用于表示表格或其他矩阵形式的数据。 9. **字符串操作** - String类:Java中的不可变字符串类,提供丰富的字符串操作方法。 - 字符串连接与比较:+运算符、concat()方法、equals()和...
4. **数组**:Java中的数组是存储同一类型元素的固定大小的序列,包括一维数组、二维数组的使用和操作。 5. **字符串(String)**:Java中的String类是一个特殊的类,用于处理文本。学生需要掌握字符串的创建、比较...
此外,还涵盖了抽象类、内部类、匿名类等高级特性,以及二维数组和对象数组的使用,这些是进一步掌握Java编程的基石。 四、JavaSE核心I 这部分内容着重于Java标准版核心I的学习,以Object类作为Java类层次结构的根...
- **多维数组**:掌握二维数组的声明和操作。 7. **异常处理**: - **异常的分类**:Java中有检查性异常(需要捕获)和非检查性异常(可以不捕获)。 - **try-catch-finally**:理解异常处理的基本结构,以及...
- 创建一个一维数组,存储10个1-100之间的随机整数。 - 使用循环找出数组的最大值、最小值、平均值和总和。 4. **运行程序**:编译并运行Applet和Java程序。 ##### 实验数据及处理结果 - **Applet参数传递**:...
- 多维数组:理解二维数组和其他多维数组的结构和操作。 7. **方法**: - 方法定义:讲解方法的参数、返回值和作用。 - 方法调用:如何在代码中使用已定义的方法。 8. **类与对象**: - 类的定义:解释类的...
5. **数组**:Java中的数组用于存储同类型的数据集合,包括一维数组、二维数组及其操作方法。 6. **字符串**:Java中的String类是不可变的,会讲解如何创建、操作和比较字符串,以及字符串的方法如substring、...
二维数组可以通过`int[][] twoDimArray = new int[行数][列数];`定义。 17. **求三个数中的最大值方法** 可以定义一个方法,接收三个整数参数,通过条件判断语句返回最大值。 18. **方法参数的区别** 实参是调用...
5. **数组**:数组是存储同一类型数据的集合,Java支持一维、二维及多维数组。 6. **字符串**:Java中的`String`类提供了丰富的字符串操作方法,学习如何创建、拼接、截取和修改字符串是Java入门的重要部分。 7. *...
4. **数组**:Java中的数组用于存储同类型的多个数据,可以是一维数组、二维数组或多维数组。 5. **字符串处理**:Java中的String类提供了丰富的字符串操作方法,如concat、substring、indexOf、replace等。 6. **...
Java中,不仅有一维数组,还有二维数组和其他多维数组。实例会解释如何声明、初始化和操作数组。 5. **字符串处理**: Java的String类提供了丰富的字符串操作方法,例如连接、截取、替换等。通过实例,学习者可以...