我想从控制台/工具(例如:Data Studio)在表中插入多行,我收到以下错误消息
外键FK $ MAR $ S的插入或更新值无效。 SQLCODE = -530,SQLSTATE = 23503,DRIVER = 4.13.111
这意味着我在使用FOREIGN KEY变量时遇到了一些麻烦,但是我稍后解决了,并且效果很好。
我的问题是,当我使用PreparedStatement.executeBatch()
从Java应用程序运行相同的查询时(批处理,因为它一次可以插入多行),我得到了另一条错误消息:
com.ibm.db2.jcc.am.wn:[jcc] [t4] [102] [10040] [3.57.82]批处理失败。 该批次已提交,但至少有一个例外发生在 批次中的单个成员。使用getNextException()检索 特定批处理元素的例外。错误代码= -4228, SQLSTATE = null
使用getNextException()
时,我得到以下信息:
com.ibm.db2.jcc.am.co:尝试执行的非原子插入语句 处理多个数据行,但发生错误
错误代码为-4228。
为什么会有这种区别?我希望Java应用程序返回与控制台工具相同的错误详细信息,以便我可以在Java代码中处理这些异常。
例如,如果返回的错误代码= -803(表示重复的异常),我将处理我的代码以进行更新而不是插入,或者如果返回的消息包含诸如“ FOREIGN KEY”之类的单词,我将告诉用户确保查找表等等
我在z / OS上使用DB2版本10.5.3,并且DB2驱动程序版本是:3.65.92
答案 0 :(得分:2)
} catch (SQLException ex) {
while (ex != null) {
if (ex instanceof com.ibm.db2.jcc.DB2Diagnosable) {
com.ibm.db2.jcc.DB2Diagnosable db2ex = (com.ibm.db2.jcc.DB2Diagnosable) ex;
com.ibm.db2.jcc.DB2Sqlca sqlca = db2ex.getSqlca();
if (sqlca != null) {
System.out.println("SQLCODE: " + sqlca.getSqlCode());
System.out.println("MESSAGE: " + sqlca.getMessage());
} else {
System.out.println("Error code: " + ex.getErrorCode());
System.out.println("Error msg : " + ex.getMessage());
}
} else {
System.out.println("Error code (non-db2): " + ex.getErrorCode());
System.out.println("Error msg (non-db2): " + ex.getMessage());
}
ex = ex.getNextException();
}
...
}
以上是处理db2异常的示例。同时有2个违规时的输出示例:批量插入的表MYSCHEMA.MYTABLE
上的唯一键和父表上的外键。我故意将其分为两部分:
在getNextException()
之前:
错误代码:-4229
错误消息:[jcc] [t4] [102] [10040] [4.19.66] ... getNextException()。 ERRORCODE = -4229,SQLSTATE =空
在getNextException()
之后:
SQLCODE:-803
MESSAGE:INSERT语句中的一个或多个值, UPDATE语句,或由DELETE语句引起的外键更新 无效,因为主键,唯一约束或唯一 由“ 1”标识的索引约束表“ MYSCHEMA.MYTABLE” 索引键的值重复。SQLCODE= -803, SQLSTATE = 23505,DRIVER = 4.19.66
SQLCODE:-530
MESSAGE:FOREIGN KEY的插入或更新值 “ MYSCHEMA.MYTABLE.MYTABLE_FK”不等于父项的任何值 父表的键。SQLCODE= -530,SQLSTATE = 23503,DRIVER = 4.19.66
答案 1 :(得分:1)
我认为批处理异常消息很清楚。考虑到批处理中的不同语句可能由于不同的原因而失败或发出警告。因此,批处理级别的错误消息是通用的,它指示您在批处理中使用“ getNextException()来检索特定的异常”语句。