如何用JDBC给存储过程传递数组类型的参数
A . 嵌套表
1.声明数组类型
createorreplacetypetab_arrayistableofvarchar2(38);暂时不要在包中声明该类型
2.创建存储过程
--该例子存储过程是在包中创建的,包名arraydemo
proceduretestArray(resNumberintab_array,procResultouttab_array)is
begin
procResult:=newtab_array();
foriin1..resNumber.Countloop
procResult.EXTEND;
procResult(i):=resNumber(i)||'lucifer'||i;
endloop;
end;
3.Java调用代码
//必须使用Oracle的连接和Statement,使用了连接池的必须通过一些方法获取原始的连接
OracleConnectionconn=null;
OracleCallableStatementstmt=null;
String[]param={"1001","1002","1006"};
stmt=(转换类型)conn.prepareCall("{callarraydemo.testArray(?,?)}");
//类型名必须大写
ArrayDescriptordescriptor=ArrayDescriptor.createDescriptor("TAB_ARRAY",conn);
stmt.setARRAY(1,newARRAY(descriptor,conn,param));
stmt.registerOutParameter(2,OracleTypes.ARRAY,"TAB_ARRAY");
stmt.execute();
ARRAYarray=stmt.getARRAY(2);
Datum[]data=array.getOracleArray();
for(inti=0;i<data.length;i++){
System.out.println(i+":"+newString(data.shareBytes()));
}
4.注意的问题及尚未解决的问题
抛出:Nonsupportedcharacterset:oracle-character-set-852异常---解决:添加nls_charset12.jar到classpath,该包在oracle/ora92/jdbc/lib目录下
待解决问题:
a)如何调用在包声明的自定义类型
b)比较不同声明类型的优缺点,及使用场合
嵌套表其它应用:http://zhouwf0726.itpub.net/post/9689/212253
B.索引表
C.内置数组
D.游标方式