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