Rs.last() дает недопустимую операцию только для форматирования только результатов: last
Я пытаюсь получить количество строк в результирующем наборе:
rs.last();
int row_count = rs.getRow();
но im получает ошибку 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);
Ответы
Ответ 1
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
заключается только в том, чтобы захватить его последнее значение, пожалуйста, подумайте о том, чтобы уточнить ваш запрос, чтобы вернуть только этот результат.
Ответ 2
PreparedStatement ps3 = conn.prepareStatement("SELECT * FROM
EMPLOYEE_TABLE WHERE LASTNAME = ?",
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATEABLE,
ResultSet.HOLD_CURSOR_OVER_COMMIT);
Для подготовленных операторов вы должны указать, как минимум, режим типа и concurrency для last() и isLast() для работы.
Ответ 3
Благодаря cheeken (2 сообщение выше), но в Java 1.8 функция createStatement() теперь нуждается в 2 параметрах
Пример:
stmt
= conx.createStatement
(ResultSet.TYPE_SCROLL_INSENSITIVE
,ResultSet.CONCUR_READ_ONLY
);