Oracle
 sql >> база данни >  >> RDS >> Oracle

JDBC Type Scroll Insensitive и Sensitive

Както и при други функции, които не работят трябва да прочетете документация преди да ги използвате.

Важното е понятието прозорец

Така че, за да наблюдавате промяната на всеки един ред, трябва да зададете размера за извличане до 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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да инстанцирам профилиран DataAdapter, който да използвам с MVC MINI PROFILER?

  2. Намерете диапазони от поредица от числа в SQL/Oracle

  3. Oracle Rolling или Running totals по месеци

  4. искам да приема въвеждане от потребителя в PL SQL и да го предам на процедура, покажете ми проста програма за това?

  5. Как да получите информация за всички видове данни, декларирани в даден пакет