rs.last () выдаёт недопустимую операцию для набора результатов только для пересылки: последний - PullRequest
14 голосов
/ 25 января 2012

Я пытаюсь получить количество строк результата, заданного:

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);

Ответы [ 3 ]

29 голосов
/ 25 января 2012

ResultSet.last() и другие «абсолютно индексированные» операции запроса доступны только в том случае, если набор результатов равен scrollable ;в противном случае вы можете выполнять итерацию по одному через набор результатов forward-only .

В следующем примере (из javadocs ) показано, как создатьпрокручиваемый ResultSet.

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

Имейте в виду, что использование прокручиваемых запросов влияет на производительность.Если целью данного конкретного ResultSet является получение только его последнего значения, рассмотрите возможность уточнения запроса, чтобы он возвращал только этот результат.

5 голосов
/ 03 декабря 2013
PreparedStatement ps = conn.prepareStatement ("SELECT * FROM
         EMPLOYEE_TABLE WHERE LASTNAME = ?" ,
         ResultSet.TYPE_SCROLL_INSENSITIVE , 
         ResultSet.CONCUR_UPDATABLE ,
         ResultSet.HOLD_CURSOR_OVER_COMMIT) ;

Для подготовленных операторов необходимо указать как минимум тип и режим параллелизма для last() и isLast() для работы.

0 голосов
/ 06 июля 2017

Благодаря cheeken (2 сообщения выше), но в Java 1.8 функции createStatement () теперь нужно 2 параметра

пример:

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