sql >> データベース >  >> RDS >> Oracle

JDBCタイプスクロールインセンシティブおよびセンシティブ

    機能しない他の機能と同様に ドキュメント それらを使用する前に。

    重要なのはウィンドウの概念です

    したがって、すべての行の変化を観察するには、フェッチサイズを設定する必要があります。 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

    JDBC結果セットタイプスクロールセンシティブ>

    短い答え 使用したデフォルトのフェッチサイズは、単一行の更新を監視するには高すぎるということです。 。

    テストは、Oracle Database 12c Enterprise Edition Release 12.2.0.1.0で行われました。 DriverVersion 12.2.0.1.0




    1. mysqlテーブルをlatin1からutf8に変換する

    2. MySQL-最も「人気のある」レコードのリストを生成します

    3. 階層的なcmsサイトを実装する方法は?

    4. SQL Serverでカーソルを使用することが悪い習慣と見なされるのはなぜですか?