私は結果セットの行数を取得しようとしています:
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);
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
の目的が最後の値を取得することだけである場合は、クエリを改良してその結果のみを返すことを検討してください。
_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同時実行モードを指定して機能させる必要があります。
Cheeken(上記の2つの投稿)のおかげで、Java 1.8では、createStatement()関数に2つのパラメーターが必要になりました
例:
stmt
= conx.createStatement
(ResultSet.TYPE_SCROLL_INSENSITIVE
,ResultSet.CONCUR_READ_ONLY
);