sql >> Database >  >> RDS >> Oracle

JDBC Type Scroll Ongevoelig en Gevoelig

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




  1. Identificeer telefoonnummers in een PL/SQL-iteratie

  2. Workbench gebruiken om verbinding te maken met een externe MySQL-server via SSH-tunnel

  3. PostgreSQL-functie voor HTML-entiteiten vervangen

  4. wat betekent Geen PersistText-waarde?