Oracle
 sql >> Datenbank >  >> RDS >> Oracle

JDBC Type Scroll Insensitiv und Sensitive

Wie bei anderen Funktionen, die nicht funktionieren Sie müssen die Dokumentation bevor Sie sie verwenden.

Das Wichtigste ist der Begriff des Fensters

Um also die Änderung jeder einzelnen Zeile zu beobachten, müssen Sie die Abrufgröße festlegen zu 1.

Beachten Sie, dass es nicht ausreicht, die Abrufgröße für resultSet festzulegen , da die Standardabrufgröße 10 ist und die Änderung nur für die 11. und die folgenden Zeilen gültig ist.

Daher muss die Fetch-Größe auf dem prepareStatement gesetzt werden :

 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

Jetzt bei jedem Aufruf von rs.next() ein neues Fenster wird geöffnet, das zu einem internen Aufruf von refreshRow

die die aktuellen Werte aus der Datenbank holt.

Beachten Sie, dass dieses Verhalten nur für TYPE_SCROLL_SENSITIVE durchgeführt wird für TYPE_SCROLL_INSENSITIVE kein refreshRow aufgerufen, sodass Sie die konstanten Daten der ursprünglichen Abfrage sehen, selbst wenn Sie das Fenster wechseln. Sie können refreshRow aufrufen ausdrücklich den gleichen Effekt zu sehen.

Technisch wird die Funktionalität über zwei Cursor realisiert. Die erste entspricht der verwendeten Abfrage und fügt nur die ROWID-Spalte hinzu.

 select rowid as "__Oracle_JDBC_internal_ROWID__", id, val from test
 where  id between :1  and :2   order by id

Der zweite Cursor, der bei jedem Fensterwechsel aufgerufen wird (d. h. für die Abrufgröße =1 für jede abgerufene Zeile), führt einfache äußere Verknüpfungen mit der gespeicherten rowid durch mit der Abfrage vom ersten Cursor, um die aktuellen Daten neu zu holen.

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 

Es gibt ähnliche Fragen, aber keine von ihnen erklärt das Problem wirklich, daher markiere ich diese Frage nicht als doppelt:

Verhalten von ResultSet.TYPE_SCROLL_SENSITIVE

JDBC ResultSet Type_Scroll_Sensitive

JDBC-Ergebnissatztyp scrollsensitiv

Die kurze Antwort liegt darin, dass die von Ihnen verwendete Standardabrufgröße zu hoch ist, um eine Aktualisierung einer einzelnen Zeile zu beobachten .

Der Test wurde auf Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 durchgeführt DriverVersion 12.2.0.1.0