Net als bij andere functies die niet werken je moet de documentatie voordat u ze gebruikt.
Het belangrijkste is het idee van het venster
Dus om de verandering van elke rij te observeren, moet je de ophaalgrootte . instellen naar 1.
Merk op dat het niet voldoende is om de ophaalgrootte in te stellen voor de resultSet , omdat de standaard ophaalgrootte 10 is en de wijziging alleen geldig is voor de 11e en de volgende rijen.
Daarom moet de ophaalgrootte worden ingesteld op de 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 bij elke aanroep van rs.next()
er wordt een nieuw venster geopend, wat leidt tot een interne aanroep van refreshRow
die de huidige waarden uit de database haalt.
Merk op dat dit gedrag alleen wordt uitgevoerd voor TYPE_SCROLL_SENSITIVE
voor TYPE_SCROLL_INSENSITIVE
nee refreshRow
wordt aangeroepen, dus je ziet de constante dataas van de eerste query, zelfs als je van venster wisselt. U kunt refreshRow
. bellen expliciet om hetzelfde effect te zien.
Technisch gezien wordt de functionaliteit geïmplementeerd met behulp van twee cursors. De eerste komt overeen met de gebruikte zoekopdracht, alleen de ROWID-kolom wordt toegevoegd.
select rowid as "__Oracle_JDBC_internal_ROWID__", id, val from test
where id between :1 and :2 order by id
De tweede cursor die op elke vensterschakelaar wordt aangeroepen (d.w.z. voor fetch size =1 voor elke opgehaalde rij) eenvoudige outer voegt zich bij de opgeslagen rowid
met de vraag van de eerste cursor om de huidige gegevens opnieuw op te halen.
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
Er zijn soortgelijke vragen, maar geen van hen verklaart het probleem echt, dus ik markeer deze vraag niet als gedupliceerd:
Gedrag van ResultSet.TYPE_SCROLL_SENSITIVE
JDBC ResultSet Type_Scroll_Sensitive
Scrollgevoelig van het type JDBC-resultaatset
Het korte antwoord is dat de standaard ophaalgrootte die je hebt gebruikt te hoog is om een update van een enkele rij waar te nemen .
De test is uitgevoerd opOracle Database 12c Enterprise Edition Release 12.2.0.1.0
DriverVersion 12.2.0.1.0