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