Вызов хранимой процедуры оракула с входным параметром с использованием 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 в параметрах хранимых процедур.