sql >> Databáze >  >> RDS >> Oracle

JDBC Type Scroll Insensitive a Sensitive

Stejně jako u jiných funkcí, které nefungují musíte si přečíst dokumentace před jejich použitím.

Důležitý je pojem okno

Chcete-li tedy pozorovat změnu každého jednotlivého řádku, musíte nastavit velikost načtení do 1.

Všimněte si, že nestačí nastavit velikost načtení pro resultSet , protože výchozí velikost načtení je 10 a změna je platná pouze pro 11. a následující řádky.

Proto musí být velikost načtení nastavena v 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

Nyní při každém volání rs.next() otevře se nové okno, které vede k internímu volání refreshRow

který získá aktuální hodnoty z databáze.

Upozorňujeme, že toto chování se provádí pouze pro TYPE_SCROLL_SENSITIVE pro TYPE_SCROLL_INSENSITIVE žádný refreshRow je zavoláno, takže vidíte konstantní data jako počáteční dotaz, i když přepnete okno. Můžete zavolat refreshRow explicitně vidět stejný efekt.

Technicky je funkce implementována pomocí dvou kurzorů. První odpovídá použitému dotazu, pouze přidává sloupec ROWID.

 select rowid as "__Oracle_JDBC_internal_ROWID__", id, val from test
 where  id between :1  and :2   order by id

Druhý kurzor vyvolaný na každém přepínači okna (tj. pro velikost načtení =1 pro každý načtený řádek) jednoduchý vnější spojuje uložený rowid s dotazem z prvního kurzoru znovu načíst aktuální data.

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 

Existují podobné otázky, ale žádná z nich nevysvětluje problém, takže tuto otázku neoznačuji jako duplicitní:

Chování ResultSet.TYPE_SCROLL_SENSITIVE

JDBC ResultSet Type_Scroll_Sensitive

citlivé na typ sady výsledků JDBC

Krátká odpověď je, že výchozí velikost načtení, kterou jste použili, je příliš vysoká, aby bylo možné sledovat aktualizaci jednoho řádku .

Test byl proveden naOracle Database 12c Enterprise Edition Release 12.2.0.1.0 DriverVersion 12.2.0.1.0




  1. Jak vložím datum do mysql jako parametr?

  2. Oracle:sjednocení všech dotazů 1 a dotazu 2 chtějí odečíst některé řádky, pokud má dotaz 1 rowdata

  3. Hostitel nepovoluje události na MySQL, což je nejlepší alternativa

  4. PostgreSQL ekvivalent pro MySQL GROUP BY