sql >> Database teknologi >  >> RDS >> Oracle

JDBC Type Rulle ufølsom og følsom

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




  1. For at hente dato fra datetime i sql

  2. Mysql count returnerer nul, hvis der ikke findes nogen post

  3. Oracle få række, hvor kolonneværdien er ændret

  4. VÆLG DISTINCT CLOB_COLUMN FRA TABEL;