高手帮我说下,java程序在调用oracle的存储过程时 能不能传入一个数组? 比如说我现在有一个数组aa[1]=1,aa[2]=2,aa[3]=3.这个数组aa能不能传入存储过程,并在存储过程中使用该数组的每个值
这个是我自己写的一个例子,你看看:在命令窗口执行以下语句,创建自定义类型NESTEDARRAY。create or replace TYPE NESTEDARRAY IS TABLE OF NUMBER; 在存储过程中使用自定义类型NESTEDARRAY。PROCEDURE GET_ARR_RESULT(INPUTARRAY IN NESTEDARRAY, AR OUT NESTEDARRAY) IS BEGIN AR := NESTEDARRAY(); FOR I IN 1 .. INPUTARRAY.COUNT LOOP AR.EXTEND; AR(I) := I|| INPUTARRAY(I); END LOOP; END GET_ARR_RESULT; Java代码:import java.sql.Connection;import java.sql.SQLException; import oracle.jdbc.OracleCallableStatement;import oracle.jdbc.OracleTypes;import oracle.sql.ARRAY;import oracle.sql.ArrayDescriptor;import oracle.sql.Datum; /** * Java获取Oracle存储过程返回自定义类型 * @author lucky star * */public class OracleTypeResultTest { /** * @param args */ public static void main(String[] args) { Connection con = null; OracleCallableStatement ocs = null; String sql = "{call test.GET_ARR_RESULT(?,?)}"; try { con = DBUtil.dbUtil.getConnection(); ocs = (OracleCallableStatement) con.prepareCall(sql); String[] params = {“10001”,”10003”}; ArrayDescriptor arrayDesc = ArrayDescriptor.createDescriptor("NESTEDARRAY", con); ARRAY inputArray = new ARRAY(arrayDesc, con, params); ocs.setARRAY(1, inputArray); ocs.registerOutParameter(2,OracleTypes.ARRAY,"NESTEDARRAY"); ocs.execute(); ARRAY array = ocs.getARRAY(2); Datum[] datum = array.getOracleArray(); for (int i=0;i<datum.length;i++) { System.out.println(datum[i].intValue()); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { if(ocs!=null)ocs.close(); if(con!=null)con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } 用VARCHAR2测试,发现存储过程中无法获取到传入的数组的值。不过,将自定义类型由varchar2改成NVarchar2就成功了。 追问 我是java新手,我把你的代码运行了一下,发现有错误。无法解析DBUtil