我試圖從Excel文件插入一些數據到表中。我有兩個excel文件如下:Oracle:唯一約束違反了異常,但我的數據實際上並未違反它
Test2:
5/12/2012 5/18/2012 ABQ ANC 1 52
5/12/2012 5/18/2012 ABQ ANC 2 30
5/12/2012 5/18/2012 ABQ ANC 3 34
5/12/2012 5/18/2012 ABQ ANC 4 41
5/12/2012 5/18/2012 ABQ ANC 5 53--->duplicate row
5/12/2012 5/18/2012 ABQ ANC 6 18
5/12/2012 5/18/2012 ABQ ANC 7 4
5/12/2012 5/18/2012 ABQ ATL 1 389
5/12/2012 5/18/2012 ABQ ATL 2 312
測試1:
5/12/2012 5/18/2012 ABQ ATL 4 259
5/12/2012 5/18/2012 ABQ ATL 5 362
5/12/2012 5/18/2012 ABQ ATL 6 240
5/12/2012 5/18/2012 ABQ ATL 7 88
5/12/2012 5/18/2012 ABQ ANC 5 53--->duplicate row
5/12/2012 5/18/2012 ABQ AUS 2 2
5/12/2012 5/18/2012 ABQ BDL 1 164
5/12/2012 5/18/2012 ABQ BDL 2 128
5/12/2012 5/18/2012 ABQ BDL 3 132
我的表,下手就是空的。所以我插入第一個文件(test2),它工作正常。當插入第二個文件(test1)時,它應該在test1的第5行給出「違反唯一約束」異常。我爲了測試而複製了那一行。我寫了下面的代碼來做插入。正如可以看到的批量大小爲3
當插入第二文件,該代碼執行第一批次(其是第一3行)的罰款。在第二批(第4-6行)中,因爲行(5)中的一個被複制,所以會引發BatchUpdatException。我捕捉到這個異常,並且在catch塊中,我每次處理一行(第4-6行)。所以行4插入應該工作正常。但事實並非如此。它會拋出一個sqlException。第5行也拋出異常(重複行)。但第6行不。第6行executeUpdate()運行良好。在這一點上,如果我看看我的數據庫表,我發現第4行也與第6行一起插入到表中。怎麼會發生這種情況,它只是在第4行拋出一個異常?
我的目標是讓用戶知道哪裏有重複的行。由於這種異常行爲,用戶被告知當他們嘗試插入第二個文件時,行4和行5中存在重複行。
String sqlStatement = "INSERT INTO DMD_VOL_UPLOAD (ORIGIN, DESTINATION, DAY_OF_WEEK, EFFECTIVE_DATE, DISCONTINUE_DATE, VOLUME)";
int batchSize=3;
sqlStatement += " VALUES(?, ?, ?, ?, ?, ?)";
con = session.connection();
pstmt = con.prepareStatement(sqlStatement);
for(currentRow=1; currentRow<=rowCount; currentRow++){
try{
forecastBatch = (ForecastBatch) list.get(currentRow-1);
pstmt = (PreparedStatement) prepareStatement(pstmt, forecastBatch);
pstmt.addBatch();
if(currentRow % batchSize == 0 || currentRow==rowCount){
updateCounts = pstmt.executeBatch();
con.commit();
pstmt.clearBatch();
}
}catch(BatchUpdateException e){
int endPoint = currentRow;
int i;
for(i=currentRow-batchSize; i<endPoint; i++){
forecastBatch = (ForecastBatch) list.get(i);
try{
pstmt = (PreparedStatement) prepareStatement(pstmt, forecastBatch);
pstmt.executeUpdate();**strong text**
con.commit();
}catch(SQLException ex){
errorRowNum = errorRowNum + (i+1) + ", ";
ex.printStackTrace();
}
}
}catch(SQLException e){
e.printStackTrace();
}
}//end of the first for loop
試圖單獨插入行之前,您嘗試在批量插入失敗後執行顯式回滾嗎? – 2012-04-27 20:33:05
不,我沒有試過 – Susie 2012-04-27 20:43:45
@ Eric Petroelje就是這樣,我不得不明確地回滾。非常感謝你。 Amaazzing ... – Susie 2012-04-27 21:25:34