Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Niewrażliwy i wrażliwy na przewijanie typu JDBC

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL - Zaawansowane usuwanie duplikatów przy użyciu ID NOT IN

  2. Zapytanie o nazwy kolumn z tabeli od innego użytkownika

  3. Uwierzytelnianie za pomocą kluczy publicznych i cx_Oracle przy użyciu Pythona

  4. Jak działa GROUP BY?

  5. PHP Oracle oci_num_rows wynik 0