我正在读取Oracle中的一个表,并将整个转储插入到DB2中。我使用简单的scala类来完成上面提到的任务。我已将插入批大小设置为300。在更新了几个批处理之后,类将抛出以下异常
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]
由于该异常与IntegrityConstraint相关,我尝试检查是否存在复合主键(ID+TimeStamp+9999-12-31 00.00.000000),但Oracle表和Db2表中都不存在组合键。Db2表的约束条件如下
COLUMN NAME UNIQUE RULE
+ID+BUSINESS_STOP+BUSINESS_START Primary
+ID Duplicate
+BUSINESS_START Duplicate
+LOW_QUALITY_IND Duplicate
+IDENTIFIER1 Duplicate
+IDENTIFIER2 Duplicate
我在SO中搜索了其他这样的问题,但没有一个修复对我有效。执行此任务的代码
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()
>
检查源数据库(Oracle)中是否真的存在相同的完整性约束。否则,您可能会导入源表中存在的行(因为没有约束),但目标表中无法导入的行。
从JDBC的角度检查两个表(Oracle和DB2)中的列索引是否真的相同。其他工具可以按列名等排序,更好的方法是:使用列名(迭代元数据中的列名)。如果对列重新排序(这可能发生),如果删除和重新添加列等,那么基于索引的方法将不起作用。例如,如果您有SELECT*from x
和INSERT into x values(...)
列顺序是相关的。
检查源表中作为约束一部分的列中是否有null
值。如果Oracle由索引支持,那么它处理约束中的null
值的方式可能与DB2不同。
我尝试将java应用程序中的值和表1中的值插入表2。我得到以下错误(db2 z/os): 因此,我想在 java 应用程序中生成的值插入到 TABLE2 中,并将 TABLE1 中的两个值插入。无需将这两个值导入应用程序。我做错了什么?
我在DB2中创建了名为“”的本地数据库,然后创建了名为“”的表。 我发现该表的模式名为“”。 我试图使用连接到数据库,但出现了这个异常 我在internet上尝试了许多解决方案,比如set模式,但不幸的是都不起作用。 这是我使用的JDBC代码
谁能告诉我问题的原因,非常感谢! ps:DB2版本为9.5
我对DB2比较陌生,但对SQL不熟悉。我在从中减去几分钟后尝试语句时遇到以下错误: 我遇到的错误是: DB2 SQL 错误: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=TCCAWZTXD;选择*;,驱动程序=3.66.46 如何修复此错误?
我的代码: 请帮助,因为这是在生产。。。
我正在尝试使用IBM Type4 JDBC驱动程序连接到远程DB2。下面是我的配置: 服务器: Windows 7 Professional DB2 LUW v10.5 DB2 SVCENAME=50000 TCP/IP通信 客户: null