Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
oracle存储过程中的java传递数组_Java_Oracle_Arrays_Stored Procedures - Fatal编程技术网

oracle存储过程中的java传递数组

oracle存储过程中的java传递数组,java,oracle,arrays,stored-procedures,Java,Oracle,Arrays,Stored Procedures,我有一个Java应用程序访问oracle存储过程。存储过程的参数包括数组类型。我是这样做的 con = this._getConnection(); Connection narrowdConn = (Connection)WSJdbcUtil.getNativeConnection( (WSJdbcConnection)con ); callable = con.prepareCall("{call MY_PKG.MY_PROCEDURE(?, ?)}"); ArrayDes

我有一个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是一种公共类型,在Oracle包中定义如下:

VARCHAR2型ARR是VARCHAR2的表(50)

并在我的存储过程中使用

PROCEDURE MY_PROCEDURE  
    (V_ARR_ARG1  IN VARCHAR2_ARR,  
     V_ARR_ARG2  IN VARCHAR2_ARR)  

类型
VARCHAR2\u ARR
是一种PLSQL类型,您将无法直接从java接口它。我建议你考虑一下类似的问题

以下是一些建议:

  • 创建可以从java绑定的SQL类型
  • 从java插入到临时表中,并在plsql中从中读取

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

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

实际上,问题是包中创建的任何类型都无法被java看到。如果我在架构级别创建类型,那么它就可以工作。@Coder:PLSQL类型不能直接从java访问。您必须使用一个真正的SQL类型(创建类型…)和一个具有此SQL类型的包装过程,或者修改您的过程以接受新类型。如果我理解正确,如果在包中声明了一个类型,则称为PLSQL类型,对吗?如果调用PLSQL类型失败,jdbc如何成功地调用包中声明和定义的过程,我对此感到困惑。这两者之间的区别是什么?它类似于在java中调用类的公共方法,但是不能直接访问私有成员。只是打个比方,我知道这不是原因。