Как и в случае с другими функциями, которые не работают , вы должны прочитать документацию перед их использованием.
Важным является понятие окна
В реализации Oracle наборов результатов, чувствительных к прокрутке, используется концепция окна с размером окна, основанным на размере выборки.Размер окна влияет на частоту обновления строк в наборе результатов.
Таким образом, чтобы наблюдать за изменением каждой отдельной строки, вы должны установить размер выборки равным 1.
Обратите внимание, что не достаточно установить размер выборки для resultSet , поскольку размер выборки по умолчанию равен 10, а изменение действительно только для 11-й и последующих строк.
Поэтому размер выборки должен быть установлен на prepareStatement
:
def stmt = con.prepareStatement("""select id, val from test
where id between ? and ? order by id""", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE)
stmt.setFetchSize(1)
// set bind variables and execute statement
Теперь при каждом вызове rs.next()
открывается новое окно, которое приводит к внутреннему вызову refreshRow
, которая получает текущие значения из базы данных.
Обратите внимание, что это поведение выполняется только для TYPE_SCROLL_SENSITIVE
, для TYPE_SCROLL_INSENSITIVE
не вызывается refreshRow
, поэтому вы видите постоянные данные на начальном запросе даже при переключении окна.Вы можете вызвать refreshRow
явно, чтобы увидеть тот же эффект.
Технически функциональность реализована с использованием двух курсоров.Первый соответствует используемому запросу, добавляя только столбец ROWID.
select rowid as "__Oracle_JDBC_internal_ROWID__", id, val from test
where id between :1 and :2 order by id
Второй курсор вызывается при каждом переключении окна (т. Е. При размере выборки = 1 для каждой выбранной строки) простые внешние соединения присоединяются к сохраненномуrowid
с запросом от первого курсора для повторного получения текущих данных.
WITH "__JDBC_ROWIDS__" AS (SELECT COLUMN_VALUE ID, ROWNUM NUM FROM TABLE(:1 ))
SELECT "__JDBC_ORIGINAL__".*
FROM (select rowid as "__Oracle_JDBC_internal_ROWID__", id, val from test
where id between :2 and :3 order by id) "__JDBC_ORIGINAL__", "__JDBC_ROWIDS__"
WHERE "__JDBC_ORIGINAL__"."__Oracle_JDBC_internal_ROWID__"(+) = "__JDBC_ROWIDS__".ID
ORDER BY "__JDBC_ROWIDS__".NUM
Есть похожие вопросы, но ни один из них не объясняет проблему, поэтому я не отмечаю этот вопрос как дублированный:
Поведение ResultSet.TYPE_SCROLL_SENSITIVE
JDBC ResultSet Type_Scroll_Sensitive
Тип набора результатов JDBC чувствителен к прокрутке
Краткий ответ является то, что размер выборки по умолчанию, который вы использовали, слишком велик, чтобы наблюдать обновление одной строки .
Тест был выполнен на Oracle Database 12c Enterprise Edition Release 12.2.0.1.0
DriverVersion 12.2.0.1.0