jdbc Java异常没有从db2控制台返回相同的异常消息吗?
我想从控制台/工具(如DataStudio)在表中插入多行,我收到以下错误消息
THE INSERT OR UPDATE VALUE OF FOREIGN KEY FK$MAR$S IS INVALID. SQLCODE=-530, SQLSTATE=23503, DRIVER=4.13.111
这意味着我在使用外键变量时遇到了一些问题,但我后来解决了这个问题,而且效果很好
我的问题是,当我使用PreparedStatement.executeBatch()
(批处理,因为它一次可以插入多行)从Java应用程序运行同一个查询时,我会收到不同的错误消息:
com.ibm.db2.jcc.am.wn: [jcc][t4][102][10040][3.57.82] Batch failure. The batch was submitted, but at least one exception occurred on an individual member of the batch. Use getNextException() to retrieve the exceptions for specific batched elements. ERRORCODE=-4228, SQLSTATE=null
当我使用getNextException()
时,我得到以下信息:
com.ibm.db2.jcc.am.co: A NON-ATOMIC INSERT STATEMENT ATTEMPTED TO PROCESS MULTIPLE ROWS OF DATA, BUT ERRORS OCCURRED
错误代码是-4228
为什么会有这种差异?我希望java应用程序返回与控制台工具相同的错误详细信息,以便在java代码中处理这些异常
例如,如果返回的错误代码=-803,这意味着重复异常,我会处理我的代码进行更新,而不是插入,或者如果返回的消息包含一些单词,如“外键”,我会告诉用户确保查找表等
我在z/OS上使用DB2版本10.5.3,DB2驱动程序版本为:3.65.92
# 1 楼答案
上面是一个处理db2异常的示例。当同时存在两个冲突时的输出示例:批插入发生的表
MYSCHEMA.MYTABLE
上的唯一键,以及父表上的外键。我故意把它分成两部分:在
getNextException()
之前:在
getNextException()
之后:# 2 楼答案
我认为批次异常信息非常清楚。考虑批处理中的不同语句可能由于不同的原因而失败或发出警告。因此,批处理级别的错误消息是通用的,它指示您使用“getNextException()检索批处理中特定语句的异常”