愚かで申し訳ありませんが、ここで何か奇妙なことが起こっています。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.");
}
デバッガーを接続して「カウント」に従うと、毎回2ずつ増加します。テーブルレコードの初期カウントを行うと、正しい量49828を取得しています。更新後、99656を取得しています。これは正確に2倍であり、更新ステートメントが実際に行を挿入していることを示しています。
文字列sqlSelectは、2つの内部結合を持つ3つのデータテーブルを返し、正しい結果を取得しています。
sqlUpdateは、3つの結合のResultSetを取得し、それらをプリペアドステートメントにプッシュするだけです。これにより、49828レコードが結果セットのデータで更新されます。
なぜこれが挿入されているのか、単に更新されているのではなく、2回挿入されているのか正確にはわかりません。誰かが私をここで正しい方向に向けることができますか?
前もって感謝します、
からだに気をつけてね、
ジョシュ