JDBC驱动问题分析一例

问题背景:有一BUG,调用平台执行存储过程接口报错,最终通拷贝oracle11g里面的ojdbc6.jar驱动到服务器里解决
也就是尽量保证服务器驱动和数据库一致,不知道是谁替换了不同版本的驱动,但是为什么不同版本会报错?下面让我们
一探究竟。
看看下面2个测试场景:
1.重现问题 ojdbc6.jar(版本号:11.2.0.1.0)
调用存储过程代码片段:
cs = con.prepareCall("CALL TEST_PROCEDURE(?)");
cs.setObject("I_P1", "ABCD");
cs.execute();
结果报错:java.sql.SQLException: 试图设置未出现在 SQL 中的参数名: I_P1
和测试服务器报错一致。
2.解决问题 ojdbc6.jar(11.2.0.3.0)
驱动换成ORACLE11g的驱动后就正常了。
查资料,JDK帮助文档里面只定义了JDBC操作的接口,各个驱动具体去实现,经过反编译看代码发现
接口CallableStatement setObject ( String parameterName, Object x)在各版本的实现有很大不同
具体附件的四个驱动如下:
ojdbc14.jar 9.0.2.0.0 没有实现直接抛异常
ojdbc14.jar 10.2.0.2.0,ojdbc6.jar 11.2.0.3.0 支持场景1的写法。
ojdbc6.jar 11.2.0.1.0 不支持场景1的写法,正确的写法如下:
cs = con.prepareCall("CALL TEST_PROCEDURE( :I_P1)");//不支持?作为占位符
cs.setObject("I_P1", "ABCD");
cs.execute();
总结:
到这里问题就搞清楚了,是因为我们在调用接口的时候没有按照接口参数格式传入。
该问题还有一个办法就是把CALL TEST_PROCEDURE( )这种改为CALL TEST_PROCEDURE( :I_P1)这种。
太坑了,不是一般都是用‘?’的吗,继续看,查看 CallableStatement prepareCall( String sql)该接口说明
‘sql - 可以包含一个或多个?参数占位符的SQL语句...’接口说明里说参数要用‘?’号作为占位
符,但是现实是很残酷的,有人就不遵守规范。
所以,为了保证我们的程序健壮性建议调用接口
PreparedStatement setObject (int parameterIndex, Object x) ,这个也是用的比较普遍
的,而且测试附件四个驱动都是没问题的。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值