使用 SqlInOutParameter 调用带有输入参数的 oracle 存储过程给出了 ojdbc8 的断言异常

Calling oracle stored procedure with input parameter using SqlInOutParameter gives assert exception with ojdbc8

我有一个一进一出参数的存储过程。输入参数由SqlInOutParameter 定义,由SqlOutParameter 输出。 ojdbc6 一切正常,但 ojbc8 在测试中给出断言异常。因为我没有在我的应用程序中启用断言,所以它在那里工作正常。

以下是存储过程的声明class

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.doInCallableStatement(JdbcTemplate.java:1144)
    at org.springframework.jdbc.core.JdbcTemplate.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;

我用过的 Jars 是 ojdbc8-12.2.0.1.0 和 spring-jdbc-4.3.13

我尝试扩展 ResultSetSupportingSqlParameter 以创建我自己的 SqlInParameter,但失败并出现异常。

我还查看了 spring 的其他 SqlParameter classes,但没有 class 仅适用于 Oracle 存储过程的 IN 参数。帮我指出我在这里做错了什么。

在存储过程的参数中使用 org.springframework.jdbc.core.SqlParameter 解决了问题。