Db2 .SqlIntegrityConstraintViolationException: SQLCODE=-803, SQLSTATE=23505

Je suis de lecture à partir d'une table Oracle et de l'insertion de l'ensemble de vidage dans Db2.
Les structures de la table sont les mêmes.Je suis à l'aide de Simples scala de classe qui ne la dite tâche. J'ai mis de l'insérer batchsize 300. Après quelques lots est mise à jour, la classe est en train de jeter le ci-dessous exception

com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException: Error for batch element #10: DB2 SQL Error: SQLCODE=-803, SQLSTATE=23505, SQLERRMC=1;PME.TM_ASSET_LQA_DETL, DRIVER=4.13.127
at com.ibm.db2.jcc.am.id.a(id.java:673) ~[db2jcc-4.13.127.jar:na]
at com.ibm.db2.jcc.am.id.a(id.java:60) ~[db2jcc-4.13.127.jar:na]
at com.ibm.db2.jcc.am.id.a(id.java:127) ~[db2jcc-4.13.127.jar:na]
at com.ibm.db2.jcc.t4.cb.a(cb.java:481) ~[db2jcc-4.13.127.jar:na]
at com.ibm.db2.jcc.t4.cb.a(cb.java:70) ~[db2jcc-4.13.127.jar:na]
at com.ibm.db2.jcc.t4.q.a(q.java:57) ~[db2jcc-4.13.127.jar:na]
at com.ibm.db2.jcc.t4.tb.a(tb.java:225) ~[db2jcc-4.13.127.jar:na]
at com.ibm.db2.jcc.am.oo.a(oo.java:3434) ~[db2jcc-4.13.127.jar:na]
at com.ibm.db2.jcc.am.oo.d(oo.java:5550) ~[db2jcc-4.13.127.jar:na]
at com.ibm.db2.jcc.am.oo.a(oo.java:4992) ~[db2jcc-4.13.127.jar:na]
at com.ibm.db2.jcc.am.oo.c(oo.java:4664) ~[db2jcc-4.13.127.jar:na]
at com.ibm.db2.jcc.am.oo.executeBatch(oo.java:2934) ~[db2jcc-4.13.127.jar:na]
at com.baml.regw.db.replicator.ReplicationRunnable$$anonfun$run$3.apply(SimpleReplicator.scala:105) ~[regw-db-replicator-0.0.933-SNAPSHOT.jar:na]
at com.baml.regw.db.replicator.ReplicationRunnable$$anonfun$run$3.apply(SimpleReplicator.scala:80) ~[regw-db-replicator-0.0.933-SNAPSHOT.jar:na]

Étant donné que l'exception était liée à IntegrityConstraint j'ai essayé de vérifier la présence de la clé primaire Composite(ID+TimeStamp+9999-12-31 00.00.000000) mais le combo n'est ni présent dans la table Oracle, ni la table Db2.
Les contraintes sur la table Db2 sont

 COLUMN NAME                         UNIQUE RULE
+ID+BUSINESS_STOP+BUSINESS_START    Primary
+ID                                 Duplicate
+BUSINESS_START                     Duplicate
+LOW_QUALITY_IND                    Duplicate
+IDENTIFIER1                        Duplicate    
+IDENTIFIER2                        Duplicate

J'ai parcouru à travers l'autre de ces questions, dans la mais aucun des correctifs a fonctionné pour moi.
Le code qui est l'exécution de cette tâche

    logger.info("Retrieving based on query string: " + queryStr + " for thread " + threadNum)
val start = System.currentTimeMillis()
val rs = stmt.executeQuery(queryStr)
val rsMd = rs.getMetaData()
val end = System.currentTimeMillis()
logger.info("Query execution time: " + (end - start) + "ms.")
done = true
var stmtCount = 0
Iterator.continually(rs).takeWhile(_.next()).foreach { rs =>
if (sourceConf.hasPath("blockSize")) {
done = false
}
//Subtract one to ignore the timestamp field that we are using
for (idx <- 1 to (rsMd.getColumnCount()-extraColumnCount)) {
try  {  
logger.info("destStmt.setObject"+rs.getObject(idx)+" column Type "+ rsMd.getColumnType(idx))
destStmt.setObject(idx, rs.getObject(idx), rsMd.getColumnType(idx))
}
catch  {
case e:Exception => {
logger.warn("While attempting to set (1-based) index: " + idx + 
" to value of type " + {if(rs.getObject(idx) != null) rs.getObject(idx).getClass().getName() else "[NULL]"} + 
" received error: " + e.getMessage())
throw e
}
}
}
destStmt.addBatch()
stmtCount += 1
if(stmtCount % { if (destConf.hasPath("batchSize")) destConf.getInt("batchSize") else 200 } == 0)  {           
destStmt.executeBatch()
destDbConn.commit()
destStmt.clearBatch()
stmtCount = 0
}
}
if(stmtCount > 0)  {
destStmt.executeBatch()
destDbConn.commit()
destStmt.clearBatch()
}
rs.close()
stmt.close()
pour vos commentaires et conseils, le problème est résolu. La table source a des lignes en double et c'était la raison derrière l'exception.Merci encore une fois.

OriginalL'auteur mavrav | 2015-03-03