引用
com.ibm.db2.jcc.am.BatchUpdateException: [jcc][t4][102][10040][4.13.127] 批处理出现故障。虽然已经提交了批处理,但是该批处理的某个成员至少发生了一个异常。
使用 getNextException() 来检索已经过批处理的特定元素的异常。 ERRORCODE=-4229, SQLSTATE=null
但实际上, 并非这个错误,这个错误是因为在批处理的时候 一个总的错误,实际上是某个批处理子项报的错误, 然后用了getNextException就得到了具体的错误,
发现是这个
Error for batch element #1: DB2 SQL Error: SQLCODE=-803, SQLSTATE=23505, SQLERRMC=5;MPOS.BAT2_CMP_RESULT, DRIVER=4.13.127
然后才想起来 4 这个值已经被我用过了, 而这个字段是有唯一索引的,然后重新弄就好了
public void batchInsertUserWithDbSwitchKey(int number, int start, Connection conn) throws SQLException{ conn.setAutoCommit(false); // "BAT2_CMP_RESULT (BATID, SRC, TRTM, CHANNEL_NO,CHL_ORDER_ID,MY_ORDER_ID,MCH_NO, SEC_MCH_NO," + // "TRAM, TRTP, REL_ORDER_ID,MEMO, BRH_ID, MY_MCH_NO,MY_SEC_MCH_NO,TERM_NO," + // "COST_RATE,TOTAL_RATE,COST,TOTAL_FEE,RZAMT,CKTURN,CKFG,CKDT,TRADE_TYPE," + // "MCH_ORDER_ID,PAYBANK,FZFG,MY_PTMCH_RATE,MY_PTMCH_FEE,D0FG,TRADE_CODE, " + // "CLDT,BANK_CODE) " + // " values(?,?,?,?,?,?,?,?," // + "?,?,?,?,?,?,?,?," // + "?,?,?,?,?,?,?,?,?," // + "?,?,?,?,?,?,?,?,?) " ); PreparedStatement ps = conn.prepareStatement("insert into " + "BAT2_CMP_RESULT (BATID, MY_ORDER_ID, MCH_NO, SEC_MCH_NO," + "TRAM, CKTURN, CKFG, BANK_CODE) " + " values(?,?,?,?,?,?,?,?) " ); try{ for(int i = 1000; i <= 2000; i++){ ps.setLong(1, 802L); ps.setString(2, String.valueOf(i)); ps.setString(3, "1"); ps.setString(4, "2"); ps.setDouble(5, 200); ps.setInt(6, 1); ps.setInt(7, 1); ps.setString(8, "303100"); ps.addBatch(); } ps.executeBatch(); }catch(SQLException e){ SQLException e1 = e.getNextException(); while(e1 != null){ System.out.println(e1.getMessage()); e1 = e1.getNextException(); } e.printStackTrace(); } conn.commit(); conn.close(); }