日期:2014-05-16  浏览次数:20335 次

如何用JDBC给存储过程传递数组类型的参数

A . 嵌套表

1. 声明数组类型
?????? create or replace type tab_array is table of varchar2(38);暂时不要在包中声明该类型

2. 创建存储过程
???????? -- 该例子存储过程是在包中创建的,包名 arraydemo
???????? procedure testArray(resNumber in tab_array,procResult out tab_array) is
???????? begin
???????????? procResult := new tab_array();
???????????? for i in 1..resNumber.Count loop
??????????????? procResult.EXTEND;
??????????????? procResult(i) := resNumber(i) || 'lucifer' || i;
???????????? end loop;
???????? end;

3. Java调用代码
??? //必须使用Oracle的连接和Statement,使用了连接池的必须通过一些方法获取原始的连接
??? OracleConnection conn = null;
??? OracleCallableStatement stmt = null;
??? String[] param = { "1001", "1002", "1006" };
??? stmt =(转换类型) conn.prepareCall("{call arraydemo.testArray(?,?)}");
??? // 类型名必须大写
??? ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("TAB_ARRAY", conn);
??? stmt.setARRAY(1, new ARRAY(descriptor,conn,param));
??? stmt.registerOutParameter(2, OracleTypes.ARRAY, "TAB_ARRAY");
??? stmt.execute();
??
??? ARRAY array = stmt.getARRAY(2);
??? Datum[] data = array.getOracleArray();
??? for (int i = 0; i < data.length; i++) {
??????? System.out.println(i + " : " + new String(data.shareBytes()));
??? }
4 . 注意的问题及尚未解决的问题
??? 抛出:Non supported character set: oracle-character-set-852 异常---解决:添加 nls_charset12.jar 到classpath,该包在oracle/ora92/jdbc/lib目录下
??? 待解决问题:
??? a) 如何调用在包声明的自定义类型
??? b) 比较不同声明类型的优缺点,及使用场合
??? 嵌套表其它应用:http://zhouwf0726.itpub.net/post/9689/212253

B . 索引表
C . 内置数组
D . 游标方式