Forward-Only Updatable Result Sets

A forward-only updatable result set maintains a cursor that can move in only one direction (forward), and also update rows.

To create a forward only updatable result set, you create a statement with concurrency mode ResultSet.CONCUR_UPDATABLE and type ResultSet.TYPE_FORWARD_ONLY.

Note: The default type is ResultSet.TYPE_FORWARD_ONLY.

Example of Forward-Only Updatable Result Set

Example of using ResultSet.updateXXX() + ResultSet.updateRow() to update a row:

  Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, 
                                        ResultSet.CONCUR_UPDATABLE);
  ResultSet uprs = stmt.executeQuery(
    "SELECT FIRSTNAME, LASTNAME, WORKDEPT, BONUS " +
    "FROM EMPLOYEE");

  while (uprs.next()) {
      int newBonus = uprs.getInt("BONUS") + 100;
      uprs.updateInt("BONUS", newBonus);
      uprs.updateRow();
  }

Example of using ResultSet.deleteRow() to delete a row:

  Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, 
                                        ResultSet.CONCUR_UPDATABLE);
  ResultSet uprs = stmt.executeQuery(
    "SELECT FIRSTNAME, LASTNAME, WORKDEPT, BONUS " +
    "FROM EMPLOYEE");

  while (uprs.next()) {
      if (uprs.getInt("WORKDEPT")==300) {
         uprs.deleteRow();
      }
  }

Visibility of Changes


Conflicting Operations

The current row of the result set cannot be changed by other transactions, because it will be locked with an update lock. Result sets that are held open after a commit must move to the next row before allowing any operations on it .

Some conflicts may prevent the result set from doing updates and deletes. For example, if the current row is deleted by a statement in the same transaction, then calls to ResultSet.updateRow() cause an exception because the cursor is no longer positioned on a valid row.