Las instrucciones OPEN, FETCH y CLOSE CURSOS se utilizan para abrir, iterar y cerrar un cursor de base de datos para las sentencias de lectura. Esta lección trata de enseñarle la parte teórica y las implicaciones que conllevan estas instrucciones.
OPEN CURSOR [WITH HOLD] dbcur FOR
SELECT result
FROM source
[[FOR ALL ENTRIES IN itab] WHERE sql_cond]
[GROUP BY group] [HAVING group_cond]
[ORDER BY sort_key].
Esta sentencia abre un cursor de base de datos para la selección definida después de FOR, y asocia una variable de cursor con el cursor de base de datos. El conjunto de resultados de la selección se puede leer con la instrucción FETCH.
El cursor dbcur espera una variable declarada con el cursor de tipo de datos predefinido específico. Un cursor de base de datos que se ha abierto no puede ser abierto otra vez. Una línea del conjunto de resultados siempre se asigna en base de datos al cursor abierto como una posición del cursor. Después de la instrucción OPEN CURSOR, la posición del cursor se coloca delante de la primera línea del conjunto de resultados.
Después de FOR, se puede introducir la sintaxis de una instrucción SELECT que contiene todas las adiciones de la sentencia SELECT normal, excepto para INTO y APPENDING.
SELECT SINGLE, SELECT SINGLE FOR UPDATE y SELECT COUNT( *) no pueden ser utilizados en la sentencia OPEN CURSOR.
Si se especifica la adición WITH HOLD, el cursor de la base de datos no se cierra mediante el commit de base de datos ejecutado con Native SQL.
La adición WITH HOLD es ignorada por los commit implícitos de la base de datos, por los commit producidos por la declaración COMMIT WORK, o por cualquier reversión que siempre cierra el cursor de base de datos.
Un commit de base de datos SQL nativo se puede realizar utilizando el módulo de función DB_COMMIT.
FETCH NEXT CURSOR dbcur {INTO|APPENDING} target.
Esta sentencia extrae las filas solicitadas (usando la adición INTO o APPENDING) del conjunto de resultados del cursor de base de datos (asociado con la variable cursor dbcur) de la posición actual del cursor y asigna estas filas a los objetos de datos especificados en el conjunto de resultados.
La variable de cursor dbcur debe ser una variable declarada por el cursor de tipo de datos predefinido especial, que se abrió con la sentencia OPEN CURSOR, o se le asignó otro cursor. De lo contrario, se produce una excepción manejable.
La sintaxis y el significado de la adición INTO o el objetivo APPENDING son completamente sinónimos de las adiciones idénticas de la sentencia SELECT.
Si se especifica un área de trabajo después de INTO, se extrae una fila. Si se especifica una tabla interna después de INTO o APPENDING, entonces se extraen todas las filas o tantas como se especifica en la adición PACKAGE SIZE.
FETCH NEXT CURSOR dbcur
INTO TABLE itab PACKAGE SIZE n.
La instrucción FETCH mueve la posición del cursor de la base de datos (que está asociada con dbcur) por la cantidad de filas extraídas a la siguiente fila que se va a extraer. Si la última fila del conjunto de resultados se extrajo en una instrucción FETCH, cada instrucción FETCH posterior en la que dbcur está asociado con el mismo cursor de base de datos establece el valor de la variable del sistema SY-SUBRC en 4, sin afectar a los objetos de datos especificados después de INTO o APPENDING.
La sentencia FETCH establece los valores de los campos del sistema SY-SUBRC y SY-DBCNT.
SY-SUBRC | Significado |
0 | Al menos una fila se extrajo del conjunto de resultados. |
4 | No se extrajo ninguna fila. |
Después de cada extracción de fila, la instrucción FETCH establece en la variable del sistema SY-DBCNT la cantidad de filas extraídas hasta ahora del conjunto de resultados relevantes. Si se produce un desbordamiento porque el número o filas es mayor que 2,147,483,647, SY-DBCNT se establece en -1. Si no se puede extraer ninguna fila, SY-DBCNT se establece en 0.
Las sentencias FETCH que acceden a las líneas de resultados pueden tener las adiciones INTO o APPENDING. Se pueden especificar áreas de trabajo o tablas internas.
Depende del sistema de base de datos si el cursor en base de datos se cierra implícitamente después de la extracción de la última fila del conjunto de resultados o no. Por esta razón, siempre es mejor utilizar explícitamente la instrucción CLOSE CURSOR.
CLOSE CURSOR dbcur.
Esta instrucción cierra el cursor de la base de datos e inicializa la variable del cursor dbcur.
Dado que sólo un número limitado de cursores de base de datos puede abrir simultáneamente, debe cerrar todos los cursores de base de datos que ya no necesita en la lógica de programación.
Inicializar una variable de cursor utilizando la instrucción CLEAR, no es suficiente para cerrar el cursor de base de datos.
Una vez cerrado el cursor de la base de datos, ya no se puede acceder a él. Otras variables de cursor que se vincularon con el cursor de base de datos no se inicializan, pero se convierten en no válidas y al acceder a ellas podría generar una excepción que se puede manejar.
Se puede usar for all entries con open cursor? Como seria la forma de hacerlo en caso q se pueda?
Hola Maria,
En ABAP, la sentencia “FOR ALL ENTRIES” no se utiliza directamente con cursores abiertos. La sentencia FOR ALL ENTRIES está diseñada para trabajar con operaciones de base de datos, como SELECT o DELETE, para realizar búsquedas eficientes utilizando los valores de una tabla interna como criterios de búsqueda.
Si estás trabajando con un cursor abierto, normalmente utilizarías la sentencia “FETCH NEXT CURSOR” para recuperar registros uno por uno del cursor.
Recordemos que:
– OPEN CURSOR WITH HOLD abre un cursor para la sentencia SELECT.
– FETCH NEXT CURSOR recupera registros uno por uno del cursor.
– CLOSE CURSOR cierra el cursor después de procesar todos los registros.
Si necesitas realizar operaciones de búsqueda utilizando valores de una tabla interna, es recomendable usar “FOR ALL ENTRIES” en combinación con SELECT. Sin embargo, esto se aplica a operaciones de base de datos y no directamente a cursores abiertos.
Un saludo.