Вызов хранимой процедуры оракула с входным параметром с использованием SqlInOutParameter дает исключение assert с ojdbc8

У меня есть хранимая процедура с одним входным и одним выходным параметром. Входной параметр определяется SqlInOutParameter и выводится SqlOutParameter. С ojdbc6 все работает нормально, но с ojbc8 это дает исключение assert в тестах. Поскольку в моем приложении не включена функция assert, она работает нормально.

Ниже приводится объявление класса хранимой процедуры.

class CustomStoredProcedure extends org.springframework.jdbc.object.StoredProcedure {

    private static final String PROCEDURE_NAME = "MY_PROCEDURE";
    private static final String INPUT_PARAM_1= "INPUT_PARAM_1";
    public static final String OUTPUT_PARAM_1 = "OUTPUT_PARAM_1";

    public CustomStoredProcedure (DataSource dataSource) {
        super(dataSource, PROCEDURE_NAME);
        declareParameter(new SqlInOutParameter(INPUT_PARAM_1, OracleTypes.NUMERIC));
        declareParameter(new SqlOutParameter(OUTPUT_PARAM_1 , OracleTypes.CURSOR));
        compile();
    }
}

Следующее является следом исключения, которое я получил

Caused by: java.lang.AssertionError: Length not positive
    at oracle.jdbc.driver.NumberCommonAccessor.getBigDecimal(NumberCommonAccessor.java:2330)
    at oracle.jdbc.driver.NumberCommonAccessor.getObject(NumberCommonAccessor.java:3075)
    at oracle.jdbc.driver.T4CVarnumAccessor.getObject(T4CVarnumAccessor.java:248)
    at oracle.jdbc.driver.OracleCallableStatement.getObject(OracleCallableStatement.java:1753)
    at oracle.jdbc.driver.OracleCallableStatementWrapper.getObject(OracleCallableStatementWrapper.java:639)
    at sun.reflect.GeneratedMethodAccessor226.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.tomcat.jdbc.pool.StatementFacade$StatementProxy.invoke(StatementFacade.java:114)
    at com.sun.proxy.$Proxy597.getObject(Unknown Source)
    at net.ttddyy.dsproxy.listener.OracleOutputParameterLogEntryCreator.getOutputParameters(OracleOutputParameterLogEntryCreator.java:65)
    at net.ttddyy.dsproxy.listener.OracleOutputParameterLogEntryCreator.getOutputParametersInDefaultFormat(OracleOutputParameterLogEntryCreator.java:46)
    at net.ttddyy.dsproxy.listener.OracleOutputParameterLogEntryCreator.getLogEntry(OracleOutputParameterLogEntryCreator.java:25)
    at net.ttddyy.dsproxy.listener.AbstractQueryLoggingListener.getEntry(AbstractQueryLoggingListener.java:32)
    at net.ttddyy.dsproxy.listener.AbstractQueryLoggingListener.afterQuery(AbstractQueryLoggingListener.java:24)
    at net.ttddyy.dsproxy.proxy.PreparedStatementProxyLogic.invoke(PreparedStatementProxyLogic.java:185)
    at net.ttddyy.dsproxy.proxy.jdk.CallableStatementInvocationHandler.invoke(CallableStatementInvocationHandler.java:29)
    at com.sun.proxy.$Proxy598.execute(Unknown Source)
    at org.springframework.jdbc.core.JdbcTemplate$6.doInCallableStatement(JdbcTemplate.java:1144)
    at org.springframework.jdbc.core.JdbcTemplate$6.doInCallableStatement(JdbcTemplate.java:1141)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1089)
    at org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1141)
    at org.springframework.jdbc.object.StoredProcedure.execute(StoredProcedure.java:123)

Ниже приведен пример хранимой процедуры для справки.

create or replace Procedure MY_PROCEDURE
    (   INPUT_PARAM_1    IN NUMBER
      ,OUTPUT_PARAM_1    OUT NUMBER
) AS
BEGIN   
    SELECT INPUT_PARAM_1 + 1 INTO OUTPUT_PARAM_1 FROM dual;
END MY_PROCEDURE;

Я использовал jar-файлы ojdbc8-12.2.0.1.0 и spring-jdbc-4.3.13

Я попытался расширить ResultSetSupportingSqlParameter, чтобы создать свой собственный SqlInParameter, который завершается с ошибкой за исключением.

Я также рассмотрел другие классы SqlParameter из Spring, но нет класса, который работает только для параметра IN процедуры Oracle Stored. Помоги мне указать, что я делаю здесь неправильно.

1 ответ

Решение

Проблема была решена с помощью org.springframework.jdbc.core.SqlParameter for в параметрах хранимых процедур.

Другие вопросы по тегам