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()
OriginalL'auteur mavrav | 2015-03-03
Vous devez vous connecter pour publier un commentaire.
Vérifier si il y a vraiment de la même contrainte d'intégrité dans votre source de données (Oracle). Sinon, vous pouvez importer des lignes qui existent dans votre table source (car il n'y a pas de contrainte), mais qui ne peuvent pas être importés dans la table cible.
Vérifier si la colonne indices sont les mêmes dans les deux tables (Oracle et DB2) du point de vue de JDBC. D'autres outils peuvent trier par nom de colonne, etc. Mieux encore: l'Utilisation des noms de colonne (itérer sur les noms de colonne dans les méta-données). Votre indice de base de l'approche ne fonctionnera pas, si les colonnes sont réorganisés qui éventuellement se passe, si les colonnes sont supprimés et rajouté etc. Par exemple, si vous avez un
select * from x
et uninsert into x values(...)
l'ordre des colonnes est pertinente.Vérifier si vous avez
null
les valeurs de votre table source dans les colonnes qui font partie de la contrainte. Éventuellement Oracle gèrenull
valeurs de la contrainte différemment DB2, si elle est supportée par un index.Tout ce que je fais est d'une sélection à partir d'Oracle et insérer les lignes dans Db2 à l'aide de Preparemend Déclaration de lot de fonctionnalités.
J'ai ajouté deux exemples concernant les #1 et #2
OriginalL'auteur Beryllium