Java异常没有从db2控制台返回相同的异常消息吗?

时间:2019-01-28 11:20:23

标签: java jdbc db2 zos

我想从控制台/工具(例如: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

2 个答案:

答案 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()来检索特定的异常”语句。