Отправить и получить список массивов в хранимую процедуру оракула

1

Я пытаюсь нажать "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.


  • 0
    это может помочь stackoverflow.com/questions/5198856/…
  • 0
    Переход на оракул работает нормально. Как вернуть?
Теги:
arrays
mybatis

1 ответ

4

Я могу успешно реализовать его с помощью 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) Сделать вызов базы данных

Наслаждаться... :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню