Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Db2.SqlIntegrityConstraintViolationException:SQLCODE=-803,SQLSTATE=23505_Java_Scala_Db2 - Fatal编程技术网

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

Java Db2.SqlIntegrityConstraintViolationException:SQLCODE=-803,SQLSTATE=23505,java,scala,db2,Java,Scala,Db2,我从Oracle中的一个表中读取数据,并将整个转储插入Db2。 表结构是一样的,我使用简单的scala类来完成上述任务。我已将insert batchsize设置为300。更新几个批之后,类将抛出以下异常 com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException: Error for batch element #10: DB2 SQL Error: SQLCODE=-803, SQLSTATE=23505, SQLERRMC=1;P

我从Oracle中的一个表中读取数据,并将整个转储插入Db2。 表结构是一样的,我使用简单的scala类来完成上述任务。我已将insert batchsize设置为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有关,我尝试检查是否存在复合主keyID+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值。。。列顺序是相关的

检查源表中作为约束一部分的列中是否有空值。如果Oracle由索引支持,那么它在约束中处理空值的方式可能与DB2不同


我已经添加了一个时间戳不为空的检查,以便排除您提到的第3点。对于第1点和第2点,我不确定oracle中的索引会如何影响到Db2的插入。我所做的只是从oracle中选择并使用Preparemend语句的批处理功能将行插入Db2。我添加了两个关于1和2的示例2@Beryllium-感谢您的评论和指导,问题已经解决。源表有重复的行,这就是异常背后的原因。再次感谢。