java – 在oracle存储过程中传递数组

我有一个Java应用程序访问oracle存储过程。 存储过程的参数包括数组类型。 我喜欢以下……

con = this._getConnection(); Connection narrowdConn = (Connection)WSJdbcUtil.getNativeConnection( (WSJdbcConnection)con ); callable = con.prepareCall("{call MY_PKG.MY_PROCEDURE(?, ?)}"); ArrayDescriptor arrayDescriptor = ArrayDescriptor.createDescriptor("VARCHAR2_ARR", narrowdConn); ARRAY arrayArg1 = new ARRAY(arrayDescriptor, con, docNames); ARRAY arrayArg2 = new ARRAY(arrayDescriptor, con, docTypes); callable.setArray(1, arrayArg1); callable.setArray(2, arrayArg2); callable.execute(); 

现在,我得到了这个例外……

 java.sql.SQLException: invalid name pattern: MY_PKG.VARCHAR2_ARR 

VARCHAR2_ARR是一个公共TYPE,在Oracle Package中定义,如下所示:

TYPE VARCHAR2_ARR是VARCHAR2的表(50);

并在我的存储过程中使用…

 PROCEDURE MY_PROCEDURE (V_ARR_ARG1 IN VARCHAR2_ARR, V_ARR_ARG2 IN VARCHAR2_ARR) 

VARCHAR2_ARR类型是PLSQL类型,您将无法直接从java接口。 我建议你在AskTom上查看关于类似问题的这个post 。

以下是一些建议:

  • 创建一个可以从java绑定的SQL TYPE
  • 从java插入临时表并在plsql中从中读取

在这两种情况下,您都必须修改PLSQL过程或添加新的转换过程。

我们需要在创建数据源时将accessToUnderlyingConnectionAllowed falg设置为true