Вызов JDBC к хранимой функции Oracle - параметр IN таблицы типов структуры

У меня есть сложная хранимая функция PL/SQL, и я должен вызвать эту функцию в JAVA. Вот процедура:

FUNCTION SUB_REPORT_INCOMPLETE(p_ACT_ID IN ACTIVITIES.ID%TYPE,
                               p_MISSING TO_SUB_MISSING) RETURN VARCHAR2;

Итак, как вы можете видеть здесь, тип моего второго параметра — TO_SUB_MISSING, который представляет собой таблицу O_SUB_MISSING:

CREATE OR REPLACE TYPE TO_SUB_MISSING AS TABLE OF O_SUB_MISSING;
CREATE OR REPLACE TYPE O_SUB_MISSING AS OBJECT (ACT_ID NUMBER, GIT_ID NUMBER, MISSING_QTY NUMBER);

После некоторых исследований я пишу этот код:

Context context = new InitialContext();
DataSource dataSource = (DataSource) context.lookup(dataSourceName);
connection = dataSource.getConnection();

StructDescriptor structDescriptor = StructDescriptor.createDescriptor("O_SUB_MISSING", connection);
STRUCT[] structs = new STRUCT[listPieces.size()];
int ind = 0;
for (PieceEntity piece : listPieces) {
    Object[] params = new Object[3];
    params[0] = piece.getActId();
    params[1] = piece.getGitId();
    params[2] = piece.getMissingQty();
    STRUCT struct = new STRUCT(structDescriptor, connection, params);
    structs[ind++] = struct;
}
ArrayDescriptor desc = ArrayDescriptor.createDescriptor("TO_SUB_MISSING", connection);

statement = connection.prepareCall(Constants.DECLARE_INCOMPLETE_MODUL);
statement.registerOutParameter(1, OracleTypes.VARCHAR);
statement.setLong(2, agmId);
statement.setArray(3, new ARRAY(desc, connection, structs));
statement.executeQuery();

Но с этим кодом я получаю исключение в строке StructDescriptor.createDescriptor:

java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper cannot be cast to oracle.jdbc.OracleConnection

Я пытаюсь устранить это исключение с помощью двух решений, которые я нашел в посте stackoverflow, но это не сработало.

Решение 1:

    OracleConnection oraConn = (OracleConnection) new DelegatingConnection(connection).getInnermostDelegate();

Решение 2:

    OracleConnection oraConn = connection.unwrap(OracleConnection.class);

Первое решение выдает одно и то же исключение, а второе — следующее исключение:

java.lang.AbstractMethodError: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.unwrap(Ljava/lang/Class;)Ljava/lang/Object;

У вас есть идея, как я могу решить мою проблему?


person Mikael    schedule 08.07.2013    source источник
comment
Для решения 1 вы установили accessToUnderlyingConnectionAllowed="true" в конфигурации контекста?   -  person Mark Rotteveel    schedule 08.07.2013
comment
Я попытался добавить ths в context.xml моего сервера tomcat: <parameter> <name>accessToUnderlyingConnectionAllowed</name> <value>true</value> </parameter> Но это ничего не изменило.   -  person Mikael    schedule 08.07.2013


Ответы (1)


Не конкретное решение, а подсказка: https://community.oracle.com/thread/718072?tstart=832 Возможно, это поможет вам решить вашу проблему.

person Bacteria    schedule 10.02.2014