JDBC アプリケーションで ResultSet の現在行が削除ホールまたは更新ホールになっているかどうかをテストする

ResultSet に TYPE_SCROLL_SENSITIVE 属性があり、基礎になっているカーソルが SENSITIVE STATIC の場合は、ResultSet の行を取得する前に、削除ホールまたは更新ホールがあるかどうかをテストする必要があります。

このタスクについて

SENSITIVE STATIC の ResultSet を開いた後も、サイズ変更はありません。 削除された行は、プレースホルダーに置き換えられているからです。そのような行のことをホール といいます。 更新された行が ResultSet の基準に適合しなくなった場合も、ホールになります。 ホールになった行を取得することはできません。

プロシージャー

ResultSet の現在行が削除ホールまたは更新ホールになっているかどうかをテストするには、以下の手順を実行します。

  1. DatabaseMetaData.deletesAreDetected または DatabaseMetaData.updatesAreDetected メソッドをTYPE_SCROLL_SENSITIVE引数とともに呼び出し、データソースがTYPE_SCROLL_SENSITIVE ResultSet 用の穴を作成しているかどうかを判断します。
  2. DatabaseMetaData.deletesAreDetected または DatabaseMetaData.updatesAreDetectedtrue を返した場合、データソースに穴が生じていることを意味します。 ResultSet.rowDeleted または ResultSet.rowUpdated メソッドを呼び出して、現在の行が削除の穴なのか更新の穴なのかを判断します。
    メソッドから true が返された場合、現在行はホールです。

現在行が削除ホールになっているかどうかをテストするコードを以下に示します。
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, 
  ResultSet.CONCUR_UPDATABLE);                 
                                        // Create a Statement object
                                        // for a scrollable, updatable
                                        // ResultSet
ResultSet rs = 
  stmt.executeQuery("SELECT EMPNO FROM EMPLOYEE FOR UPDATE OF PHONENO"); 
                                        // Create the ResultSet
DatabaseMetaData dbmd = con.getMetaData();     
                                        // Create the DatabaseMetaData object
boolean dbSeesDeletes = 
  dbmd.deletesAreDetected(ResultSet.TYPESCROLL_SENSITIVE);
                                        // Can the database see delete holes?
rs.afterLast();                         // Position the cursor at the end of
                                        // the ResultSet
while (rs.previous()) {                 // Position the cursor backward
 if (dbSeesDeletes) {                   // If delete holes can be detected
   if (!(rs.rowDeleted()))              // If this row is not a delete hole
   {
     s = rs.getString("EMPNO");         // Retrieve the employee number
     System.out.println("Employee number = " + s);
                                        // Print the column value
   }
  }
}
rs.close();                             // Close the ResultSet
stmt.close();                           // Close the Statement