Som med andre funktioner, der ikke virker du skal læse dokumentation før du bruger dem.
Det vigtige er forestillingen om vinduet
Så for at observere ændringen af hver enkelt række, skal du indstille hentestørrelsen til 1.
Bemærk, at det ikke er nok at indstille hentestørrelsen for resultatsættet , fordi standardstørrelsen for hentning er 10, og ændringen er kun gyldig for den 11. og de efterfølgende rækker.
Derfor skal hentestørrelsen indstilles 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 ved hvert kald af rs.next()
et nyt vindue åbnes, hvilket fører til et internt kald af refreshRow
som får de aktuelle værdier fra databasen.
Bemærk, at denne adfærd kun udføres for TYPE_SCROLL_SENSITIVE
for TYPE_SCROLL_INSENSITIVE
ingen refreshRow
kaldes, så du kan se de konstante data som for den indledende forespørgsel, selvom du skifter vinduet. Du kan kalde refreshRow
eksplicit for at se den samme effekt.
Teknisk er funktionaliteten implementeret ved hjælp af to markører. Den første svarer til den brugte forespørgsel og tilføjer kun ROWID-kolonnen.
select rowid as "__Oracle_JDBC_internal_ROWID__", id, val from test
where id between :1 and :2 order by id
Den anden markør kaldet på hver vindueskontakt (dvs. for hentestørrelse =1 for hver hentet række) simple ydre forbinder den gemte rowid
med forespørgslen fra den første markør for at genhente de aktuelle 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
Der er lignende spørgsmål derude, men ingen af dem forklarer virkelig problemet, så jeg markerer ikke dette spørgsmål som duplikeret:
Adfærd af ResultSet.TYPE_SCROLL_SENSITIVE
JDBC ResultSet Type_Scroll_Sensitive
JDBC resultatsæt type rullefølsom
Det korte svar er, at standard-hentningsstørrelsen, du brugte, er for høj til at observere en opdatering af en enkelt række .
Testen blev udført påOracle Database 12c Enterprise Edition Release 12.2.0.1.0
DriverVersion 12.2.0.1.0