0

愚かで申し訳ありませんが、ここで何か奇妙なことが起こっています。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回挿入されているのか正確にはわかりません。誰かが私をここで正しい方向に向けることができますか?

前もって感謝します、

からだに気をつけてね、

ジョシュ

4

1 に答える 1

0

さて、私の最初の予感は、as / 400データファイル(DB2)にファイルロックをかけているいくつかのオープンリソースがあったことは正しかったことがわかりました。かわいくて派手になるように最善を尽くしましたが、呼び出し元のメソッドをまっすぐなsqlステートメントに書き直すだけで、ソリューションに取り組むための最良の(そして最速の)方法であることが証明されました。

于 2013-03-25T17:47:40.533 に答える