对不起我的愚蠢,但我发生了一些奇怪的事情。我正在为AS / 400开发DB2数据库,并使用java中的一些预处理语句编写一些SQL。我现在正在提取49828个测试记录。当我运行pstate.executeUpdate()时,每次执行executeUpdate()时它都会返回'2'。不确定为什么。
以下是方法:
private void loadBenefitsAndDividendsData() {
PreparedStatement pstate;
String benefitTableName = "PFCASBENE";
String dividendTableName = "PFCASDVACM";
String sqlSelect = "SELECT "+ benefitTableName + ".FPLAN, " +
benefitTableName + ".FPSFLG, " + benefitTableName +
".FPLAMT, " + benefitTableName + ".FUNITS, " +
dividendTableName + ".DAPAMT, " + otherSchema + "." +
dailyTableName + ".DBPOLN FROM " + benefitTableName +
" INNER JOIN " + dividendTableName +
" ON " + benefitTableName + ".FPOLNO = " + dividendTableName +
".DAPOLN" +
" INNER JOIN " + otherSchema + "." + dailyTableName +
" ON " + dividendTableName + ".DAPOLN = " +
otherSchema + "." + dailyTableName + ".DBPOLN";
String sqlUpdate = "UPDATE " + otherSchema + "." + dailyTableName +
" SET DBAPLN = ?, DBASTA = ?, DBAFAC = ?, DBAUNI = ? , DBAPUA = ? WHERE DBPOLN = ?";
String policyNumber,dbapln, dbasta;
BigDecimal dbauni,dbafac, dbapua;
try {
pstate = dataDataSource.getConnection().prepareStatement(sqlUpdate);
ResultSet rSet = dataDataSource.getConnection().
prepareStatement(sqlSelect).executeQuery();
int count = 0;
while (rSet.next()) {
policyNumber = rSet.getString("DBPOLN");
dbapln = rSet.getString("FPLAN");
dbasta = rSet.getString("FPSFLG");
dbafac = rSet.getBigDecimal("FPLAMT");
dbauni = rSet.getBigDecimal("FUNITS");
dbapua = rSet.getBigDecimal("DAPAMT");
pstate.setString(1, dbapln);
pstate.setString(2, dbasta);
pstate.setBigDecimal(3, dbafac);
pstate.setBigDecimal(4, dbauni);
pstate.setBigDecimal(5,dbapua);
pstate.setString(6, policyNumber);
count += pstate.executeUpdate();
}
rSet.getStatement().close();
pstate.close();
} catch (SQLException sqlEx) {
logger.error("SQLException was thrown: " + sqlEx);
}
logger.info(getClass().getName() + "Has successfully loaded the PFCASBENE fields into DAILY01.");
}
当我附加调试器并遵循“count”时,它每次递增2。当我对表记录进行初始计数时,我得到的正确数量为49828,更新后,我得到99656,这是exacly double,这表示update语句实际上是插入行。
String sqlSelect返回3个包含2个内部联接的数据表,我得到了正确的结果。
sqlUpdate只是获取3个连接的ResultSet并将它们推送到预准备语句中,该语句使用结果集中的数据更新49828记录。
我不确定为什么这会插入两次,而不仅仅是更新。谁能指出我在这方面的正确方向?
提前致谢,
最热烈的问候,
约什
答案 0 :(得分:0)
事实证明,我最初的预感是正确的,有一些开放资源将文件锁定在as / 400数据文件(DB2)上。尽管我最好的尝试是可爱和花哨,只需将调用者方法重写为我的直接sql语句,被认为是解决该解决方案的最佳(也是最快)方法。