sábado, 23 de junio de 2012

Cursores Implícitos vs Cursores Explicitos en PL/SQL

Cursores Implícitos

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

No hay comentarios:

Publicar un comentario

Gracias por dejar tu comentario, por favor sea respetuoso...

Mizaq's Blog

Entradas populares