Както и при други функции, които не работят трябва да прочетете документация преди да ги използвате.
Важното е понятието прозорец
Така че, за да наблюдавате промяната на всеки един ред, трябва да зададете размера за извличане до 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