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