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

person Mike    schedule 25.01.2012    source источник


Ответы (2)


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

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

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

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

person cheeken    schedule 25.01.2012
comment
В соответствии с последней спецификацией, мы должны добавить два параметра в createStatement() — Statement statement = con.createStatement(resultSetType, resultSetConcurrency);, как описано щекеном, мы должны передать ResultSet.TYPE_SCROLL_INSENSITIVE, но при этом мы также должны передать еще один параметр — пожалуйста, обратитесь к этому — resultSetType a result set type; one of ResultSet.TYPE_FORWARD_ONLY, ResultSet.TYPE_SCROLL_INSENSITIVE, or ResultSet.TYPE_SCROLL_SENSITIVE resultSetConcurrency a concurrency type; one of ResultSet.CONCUR_READ_ONLY or ResultSet.CONCUR_UPDATABLE - person OverrockSTAR; 09.03.2016
comment
Пожалуйста, помогите мне, он говорит The method createStatement() in the type Connection is not applicable for the arguments (int), когда я пытаюсь выполнить Statement stmt = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE ); - person Squareoot; 12.01.2017
comment
@StringForever ссылается на то, что упомянул Пареш Кумар. - person Skynet; 28.07.2017
comment
@danielad На самом деле, для этой подписи метода всегда требовалось два параметра. Код в оригинале всегда был неверным. Теперь я исправил это (и обновил неработающую ссылку). - person Mark Rotteveel; 08.01.2018

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

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

person Mahdi Esmaeili    schedule 03.12.2013
comment
isLast() не требует, чтобы курсор был прокручиваемым. last() требует этого. - person isaac.hazan; 28.06.2017
comment
@isaac.hazan, неверно для любого драйвера: stackoverflow.com/questions/10597068/ - person Vadzim; 09.02.2019
comment
ResultSet.CONCUR_UPDATABLE НЕ рекомендуется использовать в коммерческих проектах. Пожалуйста, избегайте, если это возможно. - person Dhruv Singhal; 21.07.2019