sql >> Databasteknik >  >> RDS >> Oracle

JDBC-typ Scroll okänslig och känslig

Som med andra funktioner som inte fungerar du måste läsa dokumentation innan du använder dem.

Det viktiga är föreställningen om fönstret

Så för att observera förändringen av varje enskild rad måste du ställa in hämtningsstorleken till 1.

Observera att det inte räcker att ställa in hämtningsstorleken för resultatuppsättningen , eftersom standardstorleken för hämtning är 10 och ändringen är endast giltig för den 11:e och efterföljande rader.

Därför måste hämtningsstorleken ställas in på 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

Nu vid varje anrop av rs.next() ett nytt fönster öppnas, vilket leder till ett internt anrop av refreshRow

som hämtar de aktuella värdena från databasen.

Observera att detta beteende endast utförs för TYPE_SCROLL_SENSITIVE för TYPE_SCROLL_INSENSITIVE ingen refreshRow anropas, så att du ser de konstanta data som den initiala frågan även om du byter fönster. Du kan anropa refreshRow uttryckligen för att se samma effekt.

Tekniskt sett implementeras funktionen med hjälp av två markörer. Den första motsvarar den använda frågan och lägger bara till kolumnen ROWID.

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

Den andra markören som anropas på varje fönsteromkopplare (dvs. för hämtningsstorlek =1 för varje hämtad rad) enkla yttre förenar den sparade rowid med frågan från den första markören för att återhämta aktuell 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 

Det finns liknande frågor där ute, men ingen av dem förklarar riktigt problemet, så jag markerar inte den här frågan som duplicerad:

Beteende hos ResultSet.TYPE_SCROLL_SENSITIVE

JDBC ResultSet Type_Scroll_Sensitive

JDBC resultatuppsättning typ scroll sensitive

Det korta svaret är att standardstorleken för hämtning du använde är för hög för att observera en uppdatering av en enskild rad .

Testet gjordes påOracle Database 12c Enterprise Edition Release 12.2.0.1.0 DriverVersion 12.2.0.1.0




  1. Hur ska jag strukturera min inställningstabell med MySQL?

  2. MySQL:Kontrollera om användaren finns och släpp den

  3. Hur gör man flera LEFT JOINs med ELLER använder ett sammansatt index fullt ut? (del 2)

  4. MySQL Välj endast en rad från varje patient som diagnostiserats enligt det första datumet