Oracle

java.sql.SQLException: ORA-01410: 無效的 ROWID

  • April 2, 2022

我收到java.sql.SQLException: ORA-01410: invalid ROWID for some rows。

這是我的查詢。

"select OP.PLU_LONG PROD_ID," +
                         "OP.NEW_PRICE PRICE," +
                         "OP.REG_PRICE REGPRICE," +
                         "OP.QUANTITY_LIMIT QUANTITY_LIMIT," +
                         "OP.ON_AD_DATE AD_START_DATE,"+
                         "OP.OF_AD_DATE AD_END_DATE " +
                         "from ABC OP";
       try {
           Class.forName(driver);
           conn = DriverManager.getConnection(dbUrl,dbUser,dbPw);
           stmt = conn.createStatement();
           rset = stmt.executeQuery(sqlSTGOP);
           // System.out.println("Entering while block");
           while (rset.next()) {
               String price = rset.getString("PRICE");
               String reg_price = rset.getString("REGPRICE");
               String prod_id = rset.getString("PROD_ID");
               int quantity_limit = rset.getInt("QUANTITY_LIMIT");
               Date ad_start_date = rset.getDate("AD_START_DATE");
               Date ad_end_date = rset.getDate("AD_END_DATE");
           }
       } catch (SQLException sqe) {
           logger.error("**** SQLException occured while getting Special Price and Quantity Limit:"+sqe);
           error2 = sqe.toString();
           System.out.println("Problem in creating result set" + error2);
       } catch (Exception e) {
           logger.error("**** Exception occured while getting Special Price and Quantity Limit:"+e);
           error2 = e.toString();
           System.out.println("Problem in creating result set" + error2);
       }

錯誤只發生在這裡。當我們重新啟動該過程時,它就消失了。它偶爾會發生一次。當我們從結果集中獲取值時,它會拋出一個無效的 rowid sqlexception。

  • sqlSTGOP是引用上述選擇查詢的字元串常量。
  • 驅動程序:oracle.jdbc.driver.OracleDriver
  • jdbc:oracle:thin:@abcd:1521:db
  • java版本:jdk1.6
  • jdbc 版本:ojdbc14_g.jar
  • dbUrl是具有此 ABC 表的數據庫的 url
  • dbPw是那個數據庫的密碼
  • oracle:Oracle 數據庫 10g 企業版 10.2.0.1.0 版

此表上沒有 PK 或索引。

有人刪除行嗎?

在此程序之前執行一個程序,該程序刪除並載入表 ABC 下的數據,當它完成時,此程序在此之後執行。這就是為什麼我們無法找出這個錯誤的原因,即使早期的程序在開始這個程序之前完成了它的任務。

沒有其他程序、過程、觸發器、包正在使用此表 ABC。

http://www.oracle.com/technetwork/apps-tech/jdbc-112010-090769.html

並下載

http://download.oracle.com/otn/utilities_drivers/jdbc/11204/ojdbc6.jar
http://download.oracle.com/otn/utilities_drivers/jdbc/11204/orai18n.jar

刪除 class.forname 並將上面的 jars 放在你的類路徑中。鬆開 ojdbc14。

這張桌子上沒有PK…。

有些人可能會爭辯說這不是一張“合適的”表格,但那是另一個“討論”。

不可能是你的實際

$$ Java $$程式碼。

您的 while 循環正在遍歷查詢返回的每一行(其中可能有很多,因為您的查詢沒有“where”子句)。該循環將每一行的值提取到局部變數中。然後循環結束。

變數中的值將來自檢索到的最後一行(可以是任何行,因為您的查詢沒有指定“order by”子句)但循環在執行任何有用的操作之前結束,並且局部變數被簡單地丟棄。 ROWID可以改變。

如果在一個表上啟用了 ROW MOVEMENT,那麼僅僅更新一行就足以改變它的 ROWID。在該表上重建索引是 ROWID 更改的另一種(更常見的)方式。

引用自:https://dba.stackexchange.com/questions/199908