Я пытаюсь нажать "Arraylist" на хранимую процедуру оракула и после внесения необходимых изменений, объект возвращается.
У меня есть хранимая процедура oracle с параметром inout, который является "AS TABLE OF TYPE".
Я могу сделать вызов с помощью Mybatis, реализуя TypeHandler и переопределяя его метод public void setParameter (PreparedStatement ps, int i, Object parameter, JdbcType jdbcType), выдает SQLException
Но я сталкиваюсь с проблемой при извлечении объекта.
Для извлечения я Переопределите метод ниже.
public Object getResult (CallableStatement cs, int columnIndex) бросает SQLException {
ARRAY array_to_pass = ((OracleCallableStatement) cs).getARRAY(1);
/* showing content */
Datum[] elements = array_to_pass.getOracleArray();
for (int i = 0; i < elements.length; i++) {
Object[] element = ((STRUCT) elements[i]).getAttributes();
String value = (String) element[0];
System.out.println("array(" + i + ").val=" + value);
}
}
Я получаю следующую ошибку java.lang.IllegalAccessError: пытался получить доступ к классу oracle.jdbc.driver.OracleCallableStatement
Заявление об ошибке
ARRAY array_to_pass = ((OracleCallableStatement) cs).getARRAY(1);
Любые мысли/помощь по извлечению таблицы типа объекта из oracle.
Я могу успешно реализовать его с помощью Spring, Mybatis & Oracle. Код для реализации, как показано ниже
1) Создать тип в базе данных
СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ТИП TypeName AS OBJECT (
Field1 varchar (6), Field2 varchar (6))
2) Создать таблицу типа в базе данных
СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ТИП TableTypeName AS TABLE OF TypeName;
3) Создайте объект передачи в java с двумя полями
4) Генерировать необходимый arraylist для объекта передачи
5) Создать вызов базы данных
CALL StoredProcedureName (# {Parameter_in, javaType = Object, jdbcType = ARRAY, jdbcTypeName = TableTypeName, mode = INOUT, typeHandler = javaHandlername})
6) Создайте обработчик
public class javaHandlername implements TypeHandler {
// Set data to oracle object
@Override
public void setParameter(PreparedStatement ps, int i, Object parameter,
JdbcType jdbcType) throws SQLException
{
List<TO> TOs = (List<TO>) parameter;
StructDescriptor structDescriptor = StructDescriptor
.createDescriptor("TypeName", ps.getConnection());
STRUCT[] structs = null;
structs = new STRUCT[TOs.size()];
for (int index = 0; index < TOs.size(); index++) {
TO to = TO.get(index);
Object[] params = new Object[2];
params[0] = fSVDisptchSchedDely.getField1();
params[1] = fSVDisptchSchedDely.getField2();
STRUCT struct = new STRUCT(structDescriptor,
ps.getConnection(), params);
structs[index] = struct;
}
ArrayDescriptor desc = ArrayDescriptor.createDescriptor(
"TableTypeName", ps.getConnection());
ARRAY oracleArray = new ARRAY(desc, ps.getConnection(), structs);
ps.setArray(i, oracleArray);
}
// Set the result back to Java object
public Object getResult(CallableStatement cs, int columnIndex)
throws SQLException {
List<TO> TOs= new ArrayList<TO>();
Object[] structArray = (Object[]) cs.getArray(columnIndex).getArray();
oracle.sql.STRUCT mystruct = null;
for (Object structObj : structArray) {
TO to= new TO();
mystruct = (oracle.sql.STRUCT) structObj;
Object[] structAttr = mystruct.getAttributes();
to.setField1((String)structAttr[0]));
to.setField2((String)structAttr[1]));
TOs.add(to);
}
return TOs;
}
}
7) Сделать вызов базы данных
Наслаждаться... :)