Cũng như các tính năng khác không hoạt động bạn phải đọc tài liệu trước khi sử dụng chúng.
Điều quan trọng là khái niệm về cửa sổ
Vì vậy, để quan sát sự thay đổi của từng hàng, bạn phải đặt kích thước tìm nạp đến 1.
Lưu ý rằng không nên đặt kích thước tìm nạp cho resultSet , bởi vì kích thước tìm nạp mặc định là 10 và thay đổi chỉ hợp lệ cho hàng thứ 11 và các hàng tiếp theo.
Do đó, kích thước tìm nạp phải được đặt trên 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
Bây giờ trên mỗi lệnh gọi của rs.next()
một cửa sổ mới được mở, dẫn đến lệnh gọi nội bộ của refreshRow
lấy các giá trị hiện tại từ cơ sở dữ liệu.
Lưu ý rằng bahaviour này được thực hiện ony cho TYPE_SCROLL_SENSITIVE
cho TYPE_SCROLL_INSENSITIVE
không có refreshRow
được gọi, vì vậy bạn sẽ thấy dataas không đổi của truy vấn ban đầu ngay cả khi bạn chuyển cửa sổ. Bạn có thể gọi refreshRow
rõ ràng để thấy hiệu quả tương tự.
Về mặt kỹ thuật, chức năng được thực hiện bằng cách sử dụng hai con trỏ. Đầu tiên tương ứng với truy vấn đã sử dụng, chỉ thêm cột ROWID.
select rowid as "__Oracle_JDBC_internal_ROWID__", id, val from test
where id between :1 and :2 order by id
Con trỏ thứ hai được gọi trên mỗi công tắc cửa sổ (tức là cho kích thước tìm nạp =1 cho mỗi hàng được tìm nạp) đơn giản bên ngoài tham gia rowid
đã lưu với truy vấn từ con trỏ đầu tiên để tìm nạp lại dữ liệu hiện tại.
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
Có những câu hỏi tương tự ngoài đó, nhưng không có câu hỏi nào thực sự giải thích được vấn đề, vì vậy tôi không đánh dấu câu hỏi này là trùng lặp:
Hành vi của ResultSet.TYPE_SCROLL_SENSITIVE
JDBC ResultSet Type_Scroll_Sensitive
loại bộ kết quả JDBC cuộn nhạy
Câu trả lời ngắn đó là kích thước tìm nạp mặc định mà bạn đã sử dụng là cao để quan sát cập nhật của một hàng .
Kiểm tra được thực hiện trên Oracle Database 12c Enterprise Edition Release 12.2.0.1.0
DriverVersion 12.2.0.1.0