Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

JDBC Type Scroll Không nhạy cảm và nhạy cảm

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách thay đổi giá trị bắt đầu trình tự db

  2. Cập nhật n hàng ngẫu nhiên trong SQL

  3. CSV trong nhà phát triển SQL…

  4. Sử dụng hàm bảng trong OBIEE RPD (lớp vật lý) và chuyển tham số từ dấu nhắc bảng điều khiển đến nó

  5. Fluent NHibernate 3 và Oracle.DataAccess