2013-03-21 5 views
0

У меня есть класс «User» следующим образом:
передавая объект, имеющий массив оракула хранимой процедуры

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


} 

Я хочу передать объект типа User к моему оракулу хранимой процедуры, которая принимает тип объекта как параметр. Так что я сделал это, чтобы достигнуть мое решение: -

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 в качестве отдельных параметров в вашу процедуру, либо записать сохраненный proc на Java. –

ответ

0

Во-первых, я думаю, вы должны получить ArrayOutOfBoundException, потому что вы объявили объект [2] и попытались вставить в него 3-й элемент. Учитывая, что это опечатка.

Для исходной задачи вместо использования SetObject вы можете использовать * JDBCUtil.setStruct (Conn, cStmt, 1, "USER_SEARCH_OBJ", userProperties); *