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