sql >> Base de Datos >  >> RDS >> Oracle

JDBC Type Scroll Insensible y Sensible

Al igual que con otras funciones que no funcionan debe leer el documentación antes de usarlos.

Lo importante es la noción de la ventana

Entonces, para observar el cambio de cada fila, debe establecer el tamaño de recuperación a 1.

Tenga en cuenta que no es suficiente establecer el tamaño de búsqueda para el resultSet , porque el tamaño de recuperación predeterminado es 10 y el cambio solo es válido para la fila 11 y las siguientes.

Por lo tanto, el tamaño de búsqueda debe establecerse en 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

Ahora en cada llamada de rs.next() se abre una nueva ventana, lo que conduce a una llamada interna de refreshRow

que obtiene los valores actuales de la base de datos.

Tenga en cuenta que este comportamiento se realiza solo para TYPE_SCROLL_SENSITIVE para TYPE_SCROLL_INSENSITIVE sin refreshRow se llama, por lo que ve los datos constantes de la consulta inicial, incluso si cambia la ventana. Puede llamar a refreshRow explícitamente para ver el mismo efecto.

Técnicamente, la funcionalidad se implementa mediante dos cursores. La primera corresponde a la consulta utilizada, agregando únicamente la columna ROWID.

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

El segundo cursor llamado en cada interruptor de ventana (es decir, para el tamaño de búsqueda =1 para cada fila obtenida) se une externamente al rowid guardado con la consulta del primer cursor para recuperar los datos actuales.

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 

Hay preguntas similares, pero ninguna explica realmente el problema, así que no marco esta pregunta como duplicada:

Comportamiento de ResultSet.TYPE_SCROLL_SENSITIVE

JDBC ResultSet Type_Scroll_Sensitive

Sensible al desplazamiento del tipo de conjunto de resultados de JDBC

La respuesta corta es que el tamaño de recuperación predeterminado que usó es demasiado alto para observar una actualización de una sola fila .

La prueba se realizó en Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 DriverVersion 12.2.0.1.0