Cuando se ejecuta una sentencia DML (son aquellas utilizadas para insertar, borrar, modificar y consultar los datos en una base de datos) un cursor implícito es lanzado. La principal característica es que no se declara con la palabra reservada CURSOR y que se suele utilizar para trabajar con un registro especifico.
Supongamos que tenemos la siguiente tabla:
Los siguientes son ejemplos de cursores implícitos
--Ejemplo 1: INSERT INTO empleados (cedula, nombre, apellidos, direccion, username, estado) VALUES (701110222,'Perico','De los palotes', 'En algún lugar Costa Rica','perico','A'); --Ejemplo 2: UPDATE empleados SET estado := 'I' WHERE cedula = 701110222; --Ejemplo 3: DELETE empleados WHERE cedula = 701110222; --Ejemplo 4: SELECT cedula, nombre, apellidos, direccion INTO l_cedula, l_nombre, l_apellidos, l_direccion FROM empleados WHERE cedula = 701110222;
Excepciones asociadas a los cursores implícitos.
Excepción | Descripción |
NO_DATA_FOUND | Se produce cuando en una sentencia SELECT la consulta no devuelve nada, porque ninguna fila satisface las condiciones. En español "no hay datos". |
TOO_MANY_ROWS | Se produce cuando en una sentencia SELECT la consulta devuelve más de un resultado (o sea más de un registro). En español “muchas filas” |
Cursores Explícitos
Este tipo de cursores son declarados de manera explicita utilizando la palabra reservada CURSOR. Se utilizan cuando es necesario trabajar con "n" cantidad de registros.
A continuación un ejemplo:
DECLARE --Se declara el cursor explicito CURSOR c_empleados(p_estado VARCHAR2) IS SELECT * FROM empleados WHERE estado = p_estado; --Se declara un record del tipo tabla a recuperar l_Record empleados%ROWTYPE; BEGIN -- Se abre el cursor OPEN c_empleados('A'); LOOP -- Se recupera una tupla del cursor y se carga en el record FETCH c_empleados INTO l_Record; -- La siguiente sentencia es TRUE si 0 filas fueron -- retornadas en la presente iteración EXIT WHEN l_Cursor%NOTFOUND; IF length(l_Record.direccion) = 0 THEN UPDATE empleados SET estado = 'I' WHERE cedula = l_Record.cedula; END IF; END LOOP; CLOSE c_empleados; END;
El mismo ejemplo pero abreviado:
DECLARE --Se declara el cursor explicito CURSOR c_empleados(p_estado VARCHAR2) IS SELECT * FROM empleados WHERE estado = p_estado; BEGIN --Con la siguiente forma de iteración el cursor --se abre y cierra automáticamente. FOR registro IN c_empleados('A') LOOP IF length(registro.direccion) = 0 THEN UPDATE empleados SET estado = 'I' WHERE cedula = registro.cedula; END IF; END LOOP; END;
Atributos de los cursores explícitos
Atributo | Cerrado | Abierto | Durante las iteraciones | Al finalizar |
%NOFOUND | Ora-1001 | Null | False | True |
%FOUND | Ora-1001 | Null | True | False |
%ISOPEN | False | True | True | True |
%ROWCOUNT | Ora-1001 | 0 | * | ** |
* Número de registros recuperados hasta el momento
** Número de total de registro