DB2 SQL Error:SQLCODE=-418,SQLSTATE=42610,SQLERRMC=null

DB2 SQL Error:SQLCODE=-418,SQLSTATE=42610,SQLERRMC=null

问题

Java使用prepareStatement执行BD2 SQL失败

最近在Java开发工作中,需要使用JDBC去连接数据库(DB2)执行SQL。在使用prepareStatement执行sql语句时出现下面的错误情况。

错误信息:

DB2 SQL Error:SQLCODE=-418,SQLSTATE=42610,SQLERRMC=null

执行的SQL:

MERGE INTO table AS t1 USING (VALUES(?,?)) AS t2 (column1, column2) 
ON (t1.column1=t2.column1) 
WHEN MATCHED THEN UPDATE SET t1.column1=t2.column1,t1.column2=t2.column2
WHEN NOT MATCHED THEN INSERT (column1,column2) VALUES (t2.column1,t2.column2)

该SQL的功能是INSERT UPDATE,主键存在UPDATE,不存在则INSERT。

排查

首先怀疑是SQL格式错误(实际使用过程中添加字段后这个SQL特别长,很容易导致格式错误)。将该SQL取出,替换其中的?为实际填充的值,发现SQL能够正确执行,说明SQL格式没问题。

既然SQL格式没问题,那就是Java通过JDBC调用的问题了。通过搜寻发现很多人遇到的是同样的问题,虽然使用的SQL不同,但是场景类似。

原因就是:
Java使用该SQL时,是使用setObject向?的位置动态传参,而结果集里,不能传参数

参考链接https://blog.csdn.net/kuangfengbuyi/article/details/40581729

本来以为没办法,只能另外想别的办法去实现这个功能。
然而由于这次执行SQL是向多个DB2的数据库插入数据的,意外的发现有一个DB2的库执行成功了,很是意外。
第一想法就是数据库版本不同导致SQL执行成功了。

果然:
连接10版本的DB2数据库就能执行成功,9版本的DB2却是失败。

后面想通过寻找相关的说明文档来证明确实是10版本对这个情况进行了优化,但是搜寻后并没有找到。如果有哪位朋友有相关的说明,欢迎留言或分享链接。

由于确认实际使用都是10版本的DB2数据库,就没有再去深究。

结论

(没有严谨论证,只是初步推测)
DB2 9版本,通过Java调用时不支持结果集传参。
DB2 10.0版本,可以使用结果集传参。
(估计9以下都不行,10以上都可以)

(*本文只是作者对实际遇到的情况的描述和总结,没有严谨求证,如有错误之处,欢迎大家指正)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值