web-dev-qa-db-ja.com

rs.last()は、転送のみの結果セットに無効な操作を与えます:最後

私は結果セットの行数を取得しようとしています:

rs.last();
int row_count = rs.getRow();

しかし、私はInvalid operation for forward only resultset : lastエラー。結果セットは、Oracle 10gデータベースからデータを取得しています。

接続の設定方法は次のとおりです。

    Class.forName("Oracle.jdbc.driver.OracleDriver");
    String connectionString = "jdbc:Oracle:thin:@" + Oracle_ip_address + ":" + Oracle_db_port + ":" + Oracle_db_sid;
    Connection conn = DriverManager.getConnection(connectionString, Oracle_db_username, Oracle_db_password);
18
Mike

ResultSet.last()およびその他の「絶対インデックス付き」のクエリ操作は、結果セットがscrollable;の場合にのみ使用できます。それ以外の場合は、forward-only結果セットで1つずつしか反復できません。

次の例(- javadocs から)は、スクロール可能なResultSetを作成する方法を示しています。

Statement stmt = con.createStatement(
    ResultSet.TYPE_SCROLL_INSENSITIVE,
    ResultSet.CONCUR_READ_ONLY
);
ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");

スクロール可能なクエリを使用すると、パフォーマンスに影響することに注意してください。この特定のResultSetの目的が最後の値を取得することだけである場合は、クエリを改良してその結果のみを返すことを検討してください。

33
cheeken
_PreparedStatement ps = conn.prepareStatement ("SELECT * FROM
         EMPLOYEE_TABLE WHERE LASTNAME = ?" ,
         ResultSet.TYPE_SCROLL_INSENSITIVE , 
         ResultSet.CONCUR_UPDATABLE ,
         ResultSet.HOLD_CURSOR_OVER_COMMIT) ;
_

準備されたステートメントの場合、最低でも、last()isLast()の両方のタイプand同時実行モードを指定して機能させる必要があります。

5
Mahdi Esmaeili

Cheeken(上記の2つの投稿)のおかげで、Java 1.8では、createStatement()関数に2つのパラメーターが必要になりました

例:

stmt 
  = conx.createStatement
      (ResultSet.TYPE_SCROLL_INSENSITIVE
      ,ResultSet.CONCUR_READ_ONLY
      );
0
schlebe