存储过程越来越多的应用到项目当中了,不罗嗦了先来看看JAVA怎么从oracle接收对象数组。
--建立oracle对象
CREATE OR REPLACE TYPE PERSON AS OBJECT (
--如果你执意使用VARCHAR2有一定几率出现乱码和ASCII码(貌似和驱动有关)
--为了避免平台,服务器中间件,驱动等等因素而造成的
--可能出现乱码(无法识别)和以0X开头的16进制ASCII等情况请使用NVARCHAR2
P_ID NVARCHAR2(32),
P_NAME NVARCHAR2(16),
P_AGE NVARCHAR2(24),
P_PROJECT NVARCHAR2(32) )
--建立对象数组
CREATE OR REPLACE TYPE PERSON_TABLE_TYPE IS TABLE OF PERSON
--建立测试用存储过程
--PS:这个过程是在我的一个包(TEST.DEMO)里面的,如果单独写成过程请create or replace
PROCEDURE GETBEAN_OBJTABLE(V_TABLE OUT PERSON_TABLE_TYPE)
AS
BEGIN V_TABLE := PERSON_TABLE_TYPE();
FOR I IN 1 .. 5 LOOP
V_TABLE.EXTEND; V_TABLE(I) := PERSON('23231123232'||I,
'第'||I||'代',
'20'||I,
'2010-1-1'||I);
END LOOP;
END;
JAVA端
//如果你使用JDBC,
//你可以强转conn为oracleConnection也可以像我一样强转CallableStatement为OracleCallableStatement。
//但如果你使用诸如tomcat的DBCP等连接池请首先转换为native连接,然后转换为oracle连接,直接强转是无效的!
//(最后释放关闭的连接是连接池的连接而不是oracle的连接)
conn = DbHelperImpJdbc.getInstance().getConn();
cs = (OracleCallableStatement) conn.prepareCall("{call PKG_DEMO.GETBEAN_OBJTABLE(?)}");
cs.registerOutParameter(1, OracleTypes.ARRAY, "PERSON_TABLE_TYPE".toUpperCase());
ARRAY obj = (ARRAY) cs.getArray(1);
Datum[] datas = obj.getOracleArray();//获取对象
//遍历对象数组
for(int i=0;i<datas.length;i++){
System.out.println("对象"+i);
//获取属性
Object[] beanAttributes = ((STRUCT) datas[i]).getOracleAttributes();
//遍历属性
for(int m=0;m<beanAttributes.length;m++){
System.out.println(" "+beanAttributes[m]);
}
}
打印结果:
对象0
232311232321
第1代
201
2010-1-11
对象1
232311232322
第2代
202
2010-1-12
对象2
232311232323
第3代
203
2010-1-13
对象3
232311232324
第4代
204
2010-1-14
对象4
232311232325
第5代
205
2010-1-15
接下来我们来看看怎么从过程中接收二维数组,由于二维数组的接收网上资料很少,通过自己的研究发现二维数组可以先转换成一维数组,然后每个元素再逆向转换成Oracle.ARRAY,再然后按照一维数组如法炮制。
--建立一维数组
--PS也请使用NVARCHAR2
CREATE OR REPLACE TYPE TYPE_VARCHAR IS TABLE OF NVARCHAR2(2000)
--建立二维数组
CREATE OR REPLACE TYPE TYPE_VARCHAR_TABLE IS TABLE OF TYPE_VARCHAR
--建立测试用过程
PROCEDURE GETBEAN_ARRAYTABLE(V_TABLE OUT TYPE_VARCHAR_TABLE)
AS
BEGIN
V_TABLE:=TYPE_VARCHAR_TABLE();
FOR I IN 1 .. 5 LOOP
V_TABLE.EXTEND;
V_TABLE(I):=NEW TYPE_VARCHAR('23231123232'||I,
' 第'||I||'代',
'20'||I,
'2010-1-1'||I);
END LOOP;
END;
JAVA端
conn = DbHelperImpJdbc.getInstance().getConn();
cs = (OracleCallableStatement) conn.prepareCall("{call PKG_DEMO.GETBEAN_ARRAYTABLE(?)}");
cs.registerOutParameter(1, OracleTypes.ARRAY, "TYPE_VARCHAR_TABLE".toUpperCase());
cs.execute();
ARRAY obj = (ARRAY) cs.getArray(1);
//获取第一维度
Object[] firstDimension=(Object[]) obj.getArray();
for(int i=0;i<firstDimension.length;i++){
System.out.println("对象"+i);
//将第一维度元素转成ARRAY之后获取数组再将该数组元素转换成数组,
//这便是第二维度数组
Object[] secondDimension=(Object[]) ((ARRAY)firstDimension[i]).getArray();
for(int m=0;m<secondDimension.length;m++){
System.out.println(" "+secondDimension[m]);
}
}
打印结果同上。
总结:使用二维数组比对象数组灵活的多,如果我们要为返回结果集中删减字段,就必须要先去更改oracle的对象,这样很不灵活。而二维数组的可伸缩性就非常好了。
分享到:
相关推荐
Java支持一维和二维数组,以及数组的初始化、遍历、异常处理(如数组下标越界和空指针异常)等操作。Arrays类提供了许多实用方法,如排序和比较数组。 方法是组织代码的基本单元,Java的方法可以有返回值,也可以...
二维数组可以通过`int[][] twoDimArray = new int[行数][列数];`定义。 17. **求三个数中的最大值方法** 可以定义一个方法,接收三个整数参数,通过条件判断语句返回最大值。 18. **方法参数的区别** 实参是调用...
可以是一维数组、二维数组,甚至多维数组,它们在内存中连续存储,并通过索引访问。 7. **字符串处理**:Java的String类提供了丰富的字符串操作方法,如concatenation、substring、indexOf、replace等,用于创建、...
例如,你可以创建一个方法,接收一个二维数组,然后将这个数组的内容写入到一个新的Excel工作表中,这在数据分析、报表生成或者数据导出场景中非常实用。 接着是JDBC(Java Database Connectivity),它是Java平台...
Java支持一维、二维及多维数组。 7. **集合框架**:Java集合框架包括接口(如List、Set、Map)和实现这些接口的类(如ArrayList、HashSet、HashMap等)。它们提供了动态存储和操作对象的能力,比数组更灵活。 8. *...
你可以创建一维、二维或多维数组。 9. **方法**:方法是Java中的可重用代码块,可以接收参数并返回值。方法定义了对象的行为。 10. **异常处理**:Java提供了try-catch-finally语句来捕获和处理运行时错误,以保证...
Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年推出。它以其“一次编写,到处运行”的特性而闻名,因为Java程序可以在任何支持Java虚拟机(JVM)的平台上运行。在...
Java中的数组可以是一维、二维或多维的,通过索引访问其元素。 8. **方法(函数)**:方法是实现特定功能的代码块,可以接收参数并返回结果。Java中的方法重载允许同名方法但参数列表不同。 9. **类与对象**:面向...
在五子棋游戏中,棋盘的实现可能使用二维数组来存储棋子的位置。数组的每个元素可以代表棋盘上的一个格子,值可以用来标识该位置是否有棋子以及棋子的颜色。棋子的放置和检查五子连珠的逻辑将通过遍历这个数组来实现...
例如,可以创建二维数组来表示火星表面的网格,而链表可以用来记录漫游者的路径。 3. **面向对象编程**:Java是面向对象的语言,因此在项目中,你可以定义类(如MarsRover和MarsSurface),封装数据和行为。漫游者...
Java从网络取得文件 1个目标文件 简单 Java从压缩包中提取文件 1个目标文件 简单 Java存储与读取对象 1个目标文件 如题 Java调色板面板源代码 1个目标文件 摘要:Java源码,窗体界面,调色板 使用Java语言编写的一款...
你可以创建一维、二维或多维数组,并学习如何遍历和操作它们。 4. **方法**:方法是代码的重用单元,可以接收参数并返回值。了解方法的定义、调用和作用范围至关重要。 5. **面向对象编程**:Java是一种面向对象的...
4. **数组**:Java中的数组可以存储同一类型的数据集合,可以是一维、二维或多维数组。 5. **函数(方法)**:函数是实现特定功能的代码块,可以接收参数并返回值。 6. **异常处理**:Java的异常处理机制使得程序...
8. **数组**:Java支持一维、二维及多维数组,数组是一组相同类型的数据集合,通过索引来访问数组元素。 9. **字符串处理**:String类是不可变的,提供了丰富的字符串操作方法,如concat()、substring()、indexOf()...
理解一维、二维数组及其操作是基础学习的一部分。 6. **字符串处理**:String类在Java中扮演重要角色,学习其常用方法如concat、substring、indexOf、trim等对日常编程很有帮助。 7. **异常处理**:Java的异常处理...
数组是Java中存储同类型数据集合的结构,可以是一维、二维或多维数组,用于批量处理数据。 1.12 main方法传递参数 Java应用程序的入口点是`main`方法,它可以接收一个字符串数组作为参数,用于命令行参数的传递。 ...
2. **棋盘模型**:棋盘通常用二维数组来表示,每个元素代表棋盘上的一个格子。可以使用两个平行的数组,一个记录当前棋子的位置,另一个记录棋盘的状态(例如,哪个格子有棋子,颜色等)。 3. **游戏逻辑**:这是...
- Java中的数组用于存储相同类型数据的集合,可以是一维数组也可以是多维数组。 #### 四、面向对象编程要注意的问题 1. **类和对象**: - 类是对象的模板,对象是类的实例。 2. **继承**: - Java中的类可以...
二维数组可以看作是一维数组的数组。 **12. 操作数组的工具类-Arrays** `java.util.Arrays`类提供了许多静态方法,用于操作数组,例如排序、查找等。 **13. Java5新特性对数组的支持** Java5引入了增强的for循环,...
Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。它的设计目标是简洁、高效、可移植性好,适用于网络分布式环境。Java基础知识是所有Java开发者必须掌握的核心...