У меня есть класс «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);
Пожалуйста, дайте мне знать, куда я пойду.
Java и Oracle типы не эквивалентны. Вам нужно либо передать элементы вашего класса Java в качестве отдельных параметров в вашу процедуру, либо записать сохраненный proc на Java. –