Podobnie jak w przypadku innych funkcji, które nie działają musisz przeczytać dokumentacja przed ich użyciem.
Ważną rzeczą jest pojęcie okna
Aby więc obserwować zmianę każdego wiersza, musisz ustawić rozmiar pobierania do 1.
Pamiętaj, że nie wystarczy ustawić rozmiar pobierania dla resultSet , ponieważ domyślny rozmiar pobierania to 10, a zmiana obowiązuje tylko dla 11. i kolejnych wierszy.
Dlatego rozmiar pobierania musi być ustawiony w 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
Teraz przy każdym wywołaniu rs.next()
otwiera się nowe okno, które prowadzi do wewnętrznego wywołania refreshRow
który pobiera aktualne wartości z bazy danych.
Zauważ, że to zachowanie jest wykonywane tylko dla TYPE_SCROLL_SENSITIVE
dla TYPE_SCROLL_INSENSITIVE
nie refreshRow
jest wywoływana, więc widzisz stałe dane w początkowym zapytaniu, nawet po przełączeniu okna. Możesz zadzwonić refreshRow
wyraźnie, aby zobaczyć ten sam efekt.
Technicznie funkcjonalność jest realizowana za pomocą dwóch kursorów. Pierwsza odpowiada użytemu zapytaniu, dodając tylko kolumnę ROWID.
select rowid as "__Oracle_JDBC_internal_ROWID__", id, val from test
where id between :1 and :2 order by id
Drugi kursor wywoływany na każdym przełączniku okna (tj. dla rozmiaru pobierania =1 dla każdego pobranego wiersza) proste zewnętrzne dołączanie do zapisanego rowid
z zapytaniem od pierwszego kursora, aby pobrać bieżące dane.
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
Istnieją podobne pytania, ale żadne z nich tak naprawdę nie wyjaśnia problemu, więc nie oznaczam tego pytania jako zduplikowanego:
Zachowanie zestawu wyników.TYPE_SCROLL_SENSITIVE
Zestaw wyników JDBC Type_Scroll_Sensitive
Wrażliwość na przewijanie zestawu wyników JDBC
krótka odpowiedź jest to, że domyślny używany rozmiar pobierania jest zbyt wysoki, aby zaobserwować aktualizację jednego wiersza .
Test został wykonany na Oracle Database 12c Enterprise Edition Release 12.2.0.1.0
DriverVersion 12.2.0.1.0