Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Gulir Jenis JDBC Tidak Peka dan Sensitif

Seperti fitur lain yang tidak berfungsi Anda harus membaca dokumentasi sebelum menggunakannya.

Yang penting adalah gagasan tentang jendela

Jadi untuk mengamati perubahan setiap baris, Anda harus mengatur ukuran pengambilan ke 1.

Perhatikan bahwa tidak cukup menyetel ukuran pengambilan untuk resultSet , karena ukuran pengambilan default adalah 10 dan perubahan hanya berlaku untuk baris ke-11 dan berikutnya.

Oleh karena itu ukuran pengambilan harus disetel pada 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

Sekarang pada setiap panggilan rs.next() jendela baru dibuka, yang mengarah ke panggilan internal refreshRow

yang mendapatkan nilai saat ini dari database.

Perhatikan bahwa perilaku ini dilakukan hanya untuk TYPE_SCROLL_SENSITIVE untuk TYPE_SCROLL_INSENSITIVE tidak ada refreshRow dipanggil, jadi Anda melihat data konstan sebagai kueri awal bahkan saat Anda mengganti jendela. Anda dapat menghubungi refreshRow secara eksplisit untuk melihat efek yang sama.

Secara teknis fungsionalitas diimplementasikan menggunakan dua kursor. Yang pertama sesuai dengan kueri yang digunakan, hanya menambahkan kolom ROWID.

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

Kursor kedua memanggil setiap sakelar jendela (yaitu untuk ukuran pengambilan =1 untuk setiap baris yang diambil) bagian luar sederhana bergabung dengan rowid yang disimpan dengan kueri dari kursor pertama untuk mengambil kembali data saat ini.

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 

Ada pertanyaan serupa di luar sana, tetapi tidak ada yang benar-benar menjelaskan masalahnya, jadi saya tidak menandai pertanyaan ini sebagai duplikat:

Perilaku ResultSet.TYPE_SCROLL_SENSITIVE

JDBC ResultSet Type_Scroll_Sensitive

Setelan hasil JDBC jenis sensitif gulir

Jawaban singkat adalah ukuran pengambilan default yang Anda gunakan adalah tinggi untuk mengamati pembaruan satu baris .

Pengujian dilakukan padaOracle Database 12c Enterprise Edition Release 12.2.0.1.0 DriverVersion 12.2.0.1.0




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya perlu mengubah sql saya untuk mendapatkan apa yang saya inginkan dalam kasus ini?

  2. Memasukkan Data SQL Server dengan Oracle® SQL*Loader

  3. Mengisi Item Pohon Dengan Grup Rekaman Dalam Formulir Oracle

  4. Menggabungkan Semua Kolom dari Setiap Catatan Menjadi Satu Entri

  5. Pernyataan FORALL Dengan Batas Bawah &Atas di Database Oracle