与其他 不起作用的
功能一样,使用它们之前必须阅读文档。
重要的是窗口的概念
滚动敏感结果集的Oracle实现涉及窗口的概念,窗口的大小基于访存大小。窗口大小影响结果集中更新行的频率。
因此,要观察每一行的变化,必须将 提取大小 设置为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显式调用以看到相同的效果。
从技术上讲,该功能是使用两个游标实现的。第一个与使用的查询相对应,仅添加ROWID列。
select rowid as "__Oracle_JDBC_internal_ROWID__", id, val from test where id between :1 and :2 order by id
在每个窗口开关上调用的第二个游标(即,对于所获取的每一行,其获取大小= 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 testwhere id between :2 and :3 order by id) "__JDBC_ORIGINAL__", "__JDBC_ROWIDS__"WHERe "__JDBC_ORIGINAL__"."__Oracle_JDBC_internal_ROWID__"(+) = "__JDBC_ROWIDS__".IDORDER BY "__JDBC_ROWIDS__".NUM
在 简短的回答 是, 默认获取你所使用的大小来高去观察一个单列的更新 。
测试完成于
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0
DriverVersion 12.2.0.1.0



