機能しない他の機能と同様に ドキュメント それらを使用する前に。
重要なのはウィンドウの概念です
したがって、すべての行の変化を観察するには、フェッチサイズを設定する必要があります。 1に。
resultSetのフェッチサイズを設定するだけでは不十分であることに注意してください。 、デフォルトのフェッチサイズは10であり、変更は11行目以降にのみ有効であるためです。
したがって、フェッチサイズは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
rs.next()
を呼び出すたびに 新しいウィンドウが開き、 refreshRow
データベースから現在の値を取得します。
この動作は、TYPE_SCROLL_SENSITIVE
に対してのみ実行されることに注意してください。 TYPE_SCROLL_INSENSITIVE
の場合 refreshRow
はありません が呼び出されるため、ウィンドウを切り替えても、最初のクエリの定数データが表示されます。 refreshRow
を呼び出すことができます 明示的に同じ効果を確認します。
技術的には、機能は2つのカーソルを使用して実装されます。最初のクエリは使用されたクエリに対応し、ROWID列のみを追加します。
select rowid as "__Oracle_JDBC_internal_ROWID__", id, val from test
where id between :1 and :2 order by id
各ウィンドウスイッチで呼び出される2番目のカーソル(つまり、フェッチされる行ごとにフェッチサイズ=1の場合)単純な外部は、保存されたrowid
を結合します。 最初のカーソルからのクエリを使用して、現在のデータを再フェッチします。
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
そこに同様の質問がありますが、それらのどれも実際に問題を説明していないので、私はこの質問を重複としてマークしません:
ResultSet.TYPE_SCROLL_SENSITIVEの動作
JDBC ResultSet Type_Scroll_Sensitive
短い答え 使用したデフォルトのフェッチサイズは、単一行の更新を監視するには高すぎるということです。 。
テストは、Oracle Database 12c Enterprise Edition Release 12.2.0.1.0
で行われました。 DriverVersion 12.2.0.1.0