Oracle usa áreas de trabajo para ejecutar sentencias SQL y almacenar la información procesada. Hay 2 clases de cursores: implícitos y explícitos. PL/SQL declara implícitamente un cursor para todas las sentencias SQL de manipulación de datos, incluyendo consultas que devuelven una sola fila. Para las consultas que devuelven más de una fila, se debe declarar explícitamente un cursor para procesar las filas individualmente.
En este primer apartado vamos a hablar de los cursores implícitos y de los atributos de un cursor (estos atributos tienen sentido con los cursores explícitos, pero los introducimos aquí para ir abriendo boca), para luego pasar a ver los cursores explícitos y terminaremos hablando de los cursores variables.
Cursores implícitos.
Oracle abre implícitamente un cursor para procesar cada sentencia SQL que no esté asociada con un cursor declarado explícitamente.
Con un cursor implícito no podemos usar las sentencias OPEN
, FETCH
y CLOSE
para controlar el cursor. Pero sí podemos usar los atributos del cursor para obtener información sobre las sentencias SQL más recientemente ejecutadas.
Atributos de un cursor.
Cada cursor tiene 4 atributos que podemos usar para obtener información sobre la ejecución del mismo o sobre los datos. Estos atributos pueden ser usados en PL/SQL, pero no en SQL. Aunque estos atributos se refieren en general a cursores explícitos y tienen que ver con las operaciones que hayamos realizado con el cursor, es deseable comentarlas aquí y en el siguiente apartado tomarán pleno sentido.
- %
FOUND
: Después de que el cursor esté abierto y antes del primer FETCH
, %FOUND
devuelve NULL
. Después del primer FETCH
, %FOUND
devolverá TRUE
si el último FETCH
ha devuelto una fila y FALSE
en caso contrario. Para cursores implícitos %FOUND
devuelve TRUE
si un INSERT
, UPDATE
o DELETE
afectan a una o más de una fila, o un SELECT ... INTO ...
devuelve una o más filas. En otro caso %FOUND
devuelve FALSE
.
%NOTFOUND
: Es lógicamente lo contrario a %FOUND
.
%ISOPEN
: Evalúa a TRUE
si el cursor está abierto y FALSE
en caso contrario. Para cursores implícitos, como Oracle los cierra automáticamente, %ISOPEN
evalúa siempre a FALSE
.
%ROWCOUNT
: Para un cursor abierto y antes del primer FETCH
, %ROWCOUNT
evalúa a 0. Después de cada FETCH
, %ROWCOUNT
es incrementado y evalúa al número de filas que hemos procesado. Para cursores implícitos %ROWCOUNT
evalúa al número de filas afectadas por un INSERT
, UPDATE
o DELETE
o el número de filas devueltas por un SELECT ... INTO ...