2013-03-21 99 views
0

我有一类“用户”如下的对象:
使具有阵列Oracle存储过程

public class User{ 
    private String firstname; 
    private String lastname; 
    private String[] departments; 


} 

欲用户类型的对象传递给我的Oracle存储过程,它接受一个对象类型作为参数。所以,我这样做是为了实现我的解决方案: -

1. Created USER_SEARCH_OBJ as a type in database as follows:- 
     create or replace 
     TYPE USER_SEARCH_OBJ AS OBJECT (
       FIRST_NAME VARCHAR2(256), 
       LAST_NAME VARCHAR2(256), 
       DEPARTMENTS TABLE_OF_VALUES, 
     ); 

2. Created TABLE_OF_VALUES as a type in database as follows:- 
     create or replace TYPE TABLE_OF_VALUES AS TABLE OF VARCHAR2(20); 

3. Passed the User object from Java class as follows:- 
     Object[] departments = {"1","2"}; 
     StructDescriptor objDescriptor = StructDescriptor.createDescriptor("USER_SEARCH_OBJ", conn.getMetaData().getConnection()); 
     ArrayDescriptor arrayDescriptor = ArrayDescriptor.createDescriptor("TABLE_OF_VALUES", conn.getMetaData().getConnection()); 
     ARRAY departmentArr = new ARRAY(arrayDescriptor, conn.getMetaData().getConnection(), departments); 
     Object[] userProperties = new Object[2]; 
     userProperties [0] = "paras";//first_name 
     userProperties [1] = "anand";//last_name 
     userProperties [2] = departmentArr ;//department array 
     STRUCT searchObj = new STRUCT(objDescriptor, conn.getMetaData().getConnection(), userProperties); 
     CallableStatement cStmt = conn.prepareCall("PCK_SEARCH2.USER_SEARCH(?,?)"); 
     cStmt.setObject(1, searchObj); 
     cStmt.registerOutParameter(2, OracleTypes.CURSOR); 
     cStmt.execute(); 

但是当我运行这段代码我得到一个异常如下: -

java.sql.SQLException: Inconsistent java and sql object types 
    at oracle.sql.StructDescriptor.toOracleArray(StructDescriptor.java:709) 
    at oracle.sql.StructDescriptor.toArray(StructDescriptor.java:1296) 
    at oracle.sql.STRUCT.<init>(STRUCT.java:165) 
    at com.ensenda.lmp.web.controller.User.main(User.java:75) 

此异常正值该下面的代码行: -

STRUCT searchObj = new STRUCT(objDescriptor, conn.getMetaData().getConnection(), userProperties); 

请让我知道我要去哪里错了。

+0

Java和Oracle类型是不等价的。您需要将Java类的元素作为单独参数传递给您的过程,或者将您的存储过程写入Java。 – 2013-03-21 11:21:26

回答

0

首先,我认为你应该得到一个ArrayOutOfBoundException,因为你已经声明了一个Object [2]并试图将第三个元素放入它中。考虑到这是一个错字。

对于原来的问题,而不是使用的setObject可以使用 * JDBCUtil.setStruct(康涅狄格州,cstmt所,1, “USER_SEARCH_OBJ”,userProperties); *