我们有一个非常简单的Java代码,它使用CallableStatement API执行Oracle存储过程。 Oracle存储过程没有定义OUTPUT参数,但是在Java代码中我们尝试注册OUT参数并检索它:
cs = cnDBCon.prepareCall("{call "+strStoredProcedureName+ "}");
cs.registerOutParameter(1, Types.NUMERIC);
cs.execute();
int isOk = cs.getInt(1);
根据Java API(https://docs.oracle.com/javase/8/docs/api/java/sql/CallableStatement.html#getInt-int-),当返回值为SQL NULL时,结果为0.
当我们在Java7 / WebLogic 12.1.3上运行时,它运行得非常好。自从我们切换到Java8 / WebLogic 12.2.1后,我们开始收到错误:
java.sql.SQLException:缺少定义
在oracle.jdbc.driver.Accessor.isNull(Accessor.java:744)
at oracle.jdbc.driver.NumberCommonAccessor.getInt(NumberCommonAccessor.java:73)
在oracle.jdbc.driver.OracleCallableStatement.getInt(OracleCallableStatement.java:1815)
at oracle.jdbc.driver.OracleCallableStatementWrapper.getInt(OracleCallableStatementWrapper.java:780)
at weblogic.jdbc.wrapper.CallableStatement_oracle_jdbc_driver_OracleCallableStatementWrapper.getInt(Unknown Source)
显而易见的选择是更新存储过程或java代码,但我想知道行为改变的原因。它是一个更严格的JDBC驱动程序吗?