如何用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.游标方式

相关推荐