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


