类型长度大于最大值(Java调用存储过程)



ojdbc14.jar版本问题导致 类型长度大于最大值

运行环境
Eclipse / MyEclipse
oracle 11G XE
tomcat 5.0 28

oracle数据库连接用的是Torque连接的方式,驱动用的是ojdbc14.jar,创建存储过程返回游标集。
使用Connection调用prepareCall方法 我做了个测试工程一切OK,但是到项目中后,总是报如下错误:
java.sql.SQLException: 类型长度大于最大值

当时仔细检查每个参数变量的类型、长度,都没有问题,况且在测试工程中都测试通过了。

当时的java代码调用存储过程如下:
Connection conn = null;
ResultSet rst = null;
CallableStatement stmt = null;
try {
conn = (Connection) DbUtil.begin(dbName);
} catch (TorqueException e) {
log.error(e);
e.printStackTrace();
} catch (SQLException e) {
log.error(e);
e.printStackTrace();
}
stmt = conn
.prepareCall("call PKG_REPORT_UTILS.P_GET_COUNTS(?,?,?,?,?,?)");
stmt.registerOutParameter(1, java.sql.Types.NUMERIC);
stmt.registerOutParameter(2, java.sql.Types.VARCHAR);
stmt.registerOutParameter(3, oracle.jdbc.OracleTypes.CURSOR);
stmt.setString(4, yearMonth);
stmt.setString(5, msdm.getProductId());
stmt.setString(6, endYearMonthDay);
stmt.execute();
int retCode = stmt.getInt(1);
String retMsg = stmt.getString(2);
if (retCode == -1) { // 如果出错时,返回错误信息
System.out.println("报错!");
log
.error("retCode:" + retCode + " ; " + "retMsg:"
+ retMsg);
} else {
rst = ((OracleCallableStatement) stmt).getCursor(3);
// 对结果进行输出
while (rst.next()) {
orderCount = rst.getLong(1);// 订购次数
chargeCount = rst.getLong(2);// 计费次数
newOrderCount = rst.getLong(3);// 新增次数
endOrderCount = rst.getLong(4);// 退订次数
System.out.println("orderCount:" + orderCount + ";-- chargeCount:" + chargeCount
+ ";-- endOrderCount:" + endOrderCount + "; --newOrderCount" + newOrderCount + "; ");
}
}
DbUtil.closeConnection(conn);

如下异常:

java.sql.SQLException: 类型长度大于最大值
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:124)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:161)
at oracle.jdbc.driver.DatabaseError.check_error(DatabaseError.java:884)
at oracle.jdbc.driver.T4CMAREngine.buffer2Value(T4CMAREngine.java:2230)
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB4(T4CMAREngine.java:1146)
at oracle.jdbc.driver.T4CMAREngine.unmarshalDALC(T4CMAREngine.java:2097)
at oracle.jdbc.driver.T4C8TTIuds.unmarshal(T4C8TTIuds.java:127)
at oracle.jdbc.driver.T4CTTIdcb.receiveCommon(T4CTTIdcb.java:125)
at oracle.jdbc.driver.T4CTTIdcb.receiveFromRefCursor(T4CTTIdcb.java:103)
at oracle.jdbc.driver.T4CResultSetAccessor.unmarshalOneRow(T4CResultSetAccessor.

java:165)
at oracle.jdbc.driver.T4CTTIrxd.unmarshal(T4CTTIrxd.java:787)
at oracle.jdbc.driver.T4CTTIrxd.unmarshal(T4CTTIrxd.java:704)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:526)
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:179)
at oracle.jdbc.driver.T4CCallableStatement.execute_for_rows(T4CCallableStatement.java:782)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1027)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:2887)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:2978)
at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4102)
at getConnection.TestProcedure.main(TestProcedure.java:37)

最后发现测试工程和项目工程中一个Jar包 ojdbc14.jar 的大小不同:
测试工程中的大小:1.46 MB (1,536,797 字节)
项目工程中的大小:1.29 MB (1,352,918 字节)

问题解决:替换 ojdbc14.jar包

这种现象很可能是驱动版本太低导致(首先保证你的存储过程无问题,java书写方式正确),后来改成版本更改的java ORCLE驱动 问题立即解决。
参考https://www.360docs.net/doc/7b1253305.html,/blog/44466的内容:看国外网站也是这么说(2003,2004年),当时他们建议oralce公司 升级该驱动,
主要原因是classes12.jar 驱动的BUG所致,版本不支持,不支持oralce10g的某些特性,需要及时更新最新的oracle驱动 jar包,这只是一种很有可能存在的问题一个方面。

相关文档
最新文档