Está en la página 1de 9

Cursores explícitos

Características

Cuando una consulta retorna más de una fila, necesitamos definir un


cursor explícito. No podemos utilizar una cláusula SELECT INTO. Un
cursor implícito es gestionado por PL/SQL; los cursores implícitos son
abiertos cuando la consulta comienza y cerrados automáticamente
cuando ésta acaba. Un cursor explícito es definido en la sección de
declaraciones del bloque PL/SQL y es abierto, consultado y cerrado en
el bloque de ejecución o en el bloque de excepciones. Un cursor
explícito puede ser considerado como un array sin límite superior.
Puede tener cualquier número de filas.
Cursores implícitos
Salida producida por sentencias DML

Cuando una sentencia DML (SELECT, INSERT, UPDATE o DELETE) es


ejecutada, los parámetros de salida de la sentencia son almacenados
en cuatro atributos del cursor.

Cuando se ejecutan estas sentencias DML, PL/SQL abre un cursor


interno (al que llamamos implícito) y procesa el resultado. El cursor
se abre únicamente para permitir la instrucción y se cierra cuando
ésta se completa.

Los cuatro atributos son:


1. SQL%FOUND. Antes de ejecutar cualquier DML, su valor es
NULL. Después de la ejecución será:
a. TRUE si la DML es una inserción
b. TRUE si el borrado o modificado afectan a, al menos, una
fila
c. TRUE si la sentencia es una consulta y obtiene un valor.
Si es más de uno, se producirá un error
(TOO_MANY_ROWS)
2. SQL%NOTFOUND. Inverso al anterior
3. SQL%ROWCOUNT. Número de filas tratadas. Antes de cualquier
DML, su valor será NULL. Después dependerá del número de
filas que haya tratado la sentencia.
4. SQL%ISOPEN. Indicador de si el cursor está abierto o cerrado.
Siempre será FALSE, ya que una vez acabada la sentencia DML,
el cursor implícito se cierra automáticamente
Usando cursores

Normalmente, el término cursor se utiliza para referirnos a un cursor


explícito. De aquí en adelante utilizaremos el término cursor para
hacer referencia a un cursor explícito. El cursor tiene un nombre y
una consulta.

Declarando un cursor

La declaración de un cursor define la cláusula SELECT de la consulta


que necesitamos ejecutar en el cuerpo del bloque. Una sintaxis
simple sería:

El nombre del cursor es una variable PL/SQL no declarada. No


podemos asignar valores a un nombre de cursor o utilizarlo en una
expresión.

Podemos utilizar una vista o consultar de múltiples tablas/vistas en la


definición del cursor. Si utilizamos el asterisco para recuperar todas
las columnas, debemos llevar cuidado, ya que si hay más de una
columna con el mismo nombre, el cursor fallará.

Abrir un cursor

Un cursor debe ser abierto antes de que el valor de sus filas pueda
ser utilizado. Abrir el cursor inicia el proceso de consulta.

Donde cursor_name es el nombre del cursor definicdo en la sección


de declaración.
Cerrar un cursor

Los cursores explícitos deben ser cerrados explícitamente.

Consultar (fetch) un cursor

Un cursor es consultado para obtener una fila. Después de cada


consulta, el cursor avanza a la siguiente fila del conjunto de
resultados.

Para cada columna definida en la SELECT de la definición, debe haber


una variable correspondiente en la lista de variables del FETCH. Las
variables deben estar declaradas del tipo de datos correcto en la
sección de declaración.
Si hacemos una consulta de una tabla, puede definirse el tipo
ligándolo con el tipo de fila de la tabla.

Podemos ligar el tipo de fila con el propio cursor. El único


requerimiento es que la definición del cursor sea anterior a la
declaración de la variable.
Cursores con parámetros

Podemos pasarle parámetros a un cursor y utilizarlos en la propia


consulta. Esto es muy útil cuando se debe abrir un cursor basado en
ciertas condiciones. La sintaxis es:

Donde la sintaxis de definición de parámetros es:

La única diferencia con un procedimiento es que los parámetros sólo


pueden ser de entrada. Sólo el tipo de datos de los parámetros es
especificado, no su longitud. Opcionalmente se le puede pasar un
valor por defecto al cursor, que será utilizado si no se le especifica
ningún valor en el momento de su apertura.

Deberíamos utilizar siempre la cláusula %TYPE al definir parámetros


de un cursor.

La sintaxis para abrir un cursor con parámetros es:

Donde value puede ser tanto una variable como un literal.

Si no se han definido valores por defecto para un parámetro, abrir el


cursor sin invocar al parámetro causará un error.
Bucles FOR y cursores

En la gran mayoría de los casos, la utilización de cursores sigue un


patrón ya establecido:
1. Abrir el cursor
2. Inicializar el bucle
3. Consultar el cursor
4. Chequear que el cursor haya retornado valores
5. Procesar los datos
6. Cerrar el bucle
7. Cerrar el cursor

Para evitar una gestión tan engorrosa, podemos utilizar un bucle


FOR, que se encarga de:
1. Abrir el cursor
2. Consultar el cursor
3. Evaluar si ha devuelto datos
4. Cerrar el cursor

La gran ventaja del FOR es que nunca se producirá un bucle infinito.


Tampoco tenemos que definir la variable que recorrerá el cursor. El
inconveniente es gestionar si queremos salir del bucle antes de que
haya finalizado.

Cuando utilizamos expresiones en la declaración del cursor, debemos


especificar un nombre de alias para la declaración. Haremos
referencia a la expresión utilizando dicho alias.

Se puede salir de un FOR utilizando las sentencias EXIT o GOTO,


aunque no sea recomendable. Una vez se acaba el bucle, se cierra el
cursor.
Cursor FOR usando una consulta

Se puede definir la consulta en la propia sentencia FOR especificando


la consulta. El cursor definido así no tiene nombre asociado. No es
una buena práctica definirlo así, ya que no es reutilizable por otro
bucle.

Subconsultas en un cursor

No hay limitación a la hora de incluir subconsultas en un cursor

Modificar y borrar utilizando un cursor

PL/SQL provee de mecanismos para modificar o borrar el registro al


que estamos accediendo con el cursor explícito. Utilizaremos la
palabra clave NOWAIT si no queremos esperar al hacer la consulta y
preferimos que se produzca un error. El FOR UPDATE no se puede
especificar en una subconsulta.

Para modificar o eliminar el registro al cual se está accediendo con el


cursor se debe cumplir:
1. Se modificará o borrará con la cláusula WHERE CURRENT OF
2. El cursor se declarará con la cláusula FOR UPDATE
DECLARE
CURSOR C_EMPLEADO IS
SELECT *
FROM EMPLEADOS
FOR UPDATE NOWAIT;
BEGIN
FOR V_EMPLEADO IN C_EMPLEADO LOOP
UPDATE EMPLEADO
SET NOMBRE = UPPER(NOMBRE)
WHERE CURRENT OF C_EMPLEADO;
END LOOP;
END;

También podría gustarte