有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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


共 (2) 个答案

  1. # 1 楼答案

        } 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异常的示例。当同时存在两个冲突时的输出示例:批插入发生的表MYSCHEMA.MYTABLE上的唯一键,以及父表上的外键。我故意把它分成两部分:

    getNextException()之前:

    Error code: -4229

    Error msg : [jcc][t4][102][10040][4.19.66] ... getNextException(). ERRORCODE=-4229, SQLSTATE=null

    getNextException()之后:

    SQLCODE: -803

    MESSAGE: One or more values in the INSERT statement, UPDATE statement, or foreign key update caused by a DELETE statement are not valid because the primary key, unique constraint or unique index identified by "1" constrains table "MYSCHEMA.MYTABLE" from having duplicate values for the index key.. SQLCODE=-803, SQLSTATE=23505, DRIVER=4.19.66

    SQLCODE: -530

    MESSAGE: The insert or update value of the FOREIGN KEY "MYSCHEMA.MYTABLE.MYTABLE_FK" is not equal to any value of the parent key of the parent table.. SQLCODE=-530, SQLSTATE=23503, DRIVER=4.19.66

  2. # 2 楼答案

    我认为批次异常信息非常清楚。考虑批处理中的不同语句可能由于不同的原因而失败或发出警告。因此,批处理级别的错误消息是通用的,它指示您使用“getNextException()检索批处理中特定语句的异常”