0

私は次のようにクラス「ユーザー」を持っています:

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 );

どこが間違っているのか教えてください。

4

1 に答える 1

0

まず、Object[2] を宣言し、3 番目の要素をそれに入れようとしているため、 ArrayOutOfBoundExceptionを取得する必要があると思います。それを考えると、それはタイプミスです。

元の問題については、setObject を使用する代わりに *JDBCUtil.setStruct(conn,cStmt,1,"USER_SEARCH_OBJ",userProperties);* を使用できます。

于 2014-03-25T06:16:20.187 に答える