2009-09-09 34 views
2

我有一个访问oracle存储过程的Java应用程序。存储过程的参数包括一个数组类型。我不喜欢它的下面...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包中定义如下所示:

TYPE VARCHAR2_ARR IS TABLE OF VARCHAR2(50);

而在我的存储过程中使用这样的...

PROCEDURE MY_PROCEDURE 
    (V_ARR_ARG1 IN VARCHAR2_ARR, 
    V_ARR_ARG2 IN VARCHAR2_ARR) 

回答

1

类型VARCHAR2_ARR是PLSQL类型,你将不能够直接从Java接口它。我建议你看看this thread on AskTom关于类似的问题。

这里有几个建议:

  • 创建您可以从Java
  • 插入

绑定到一个临时表从Java和读取它PLSQL在这一个SQL TYPE您将不得不修改PLSQL过程或添加新的翻译过程。

+0

实际上问题是,在一个包中创建的任何类型不是在Java可见accessToUnderlyingConnectionAllowed falg如此。如果我在模式级创建类型,那么它就可以工作。 – coder 2009-09-10 06:09:20

+0

@编码器:PLSQL类型不能直接从java访问。您将不得不使用一个真正的SQL类型(CREATE类型...)和包含此SQL类型的包装过程,或者修改您的过程以接受新类型。 – 2009-09-10 06:32:39

+0

如果我的理解正确,如果在一个包内声明了一个类型,那么它被称为PLSQL类型正确吗?我很困惑,如果调用PLSQL类型失败,jdbc如何成功调用在程序包内声明和定义的过程。两者有什么区别? – 2011-06-02 08:52:12

0

我们需要设置在创建数据源

相关问题