簡體   English   中英

在PreparedStatement中調用UPDATE時發生插入

[英]Insert happening when UPDATE is called in PreparedStatement

對不起,我很愚蠢,但是我這里發生了一些奇怪的事情。 我正在為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,這是原來的兩倍,這表明update語句實際上是在插入行。

字符串sqlSelect返回帶有2個內部聯接的3個數據表,而我得到的是正確的結果。

sqlUpdate只是采用3個聯接的ResultSet並將它們推入prepared語句,該語句使用結果集中的數據更新49828記錄。

我不確定這為什么要插入,然后兩次而不是簡單地更新。 有人可以在這里指出正確的方向嗎?

提前致謝,

溫馨問候,

喬希

好吧,事實證明,我最初的預感是對的,有一些開放資源正在將文件鎖放在as / 400數據文件(DB2)上。 盡管我盡力使自己變得可愛和幻想,但只需將調用方方法重新編寫為我直接的sql語句即可,這被認為是解決該問題的最佳方法(也是最快的方法)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM