TIPOS DE CURSORES

Existen dos tipos de Cursores: Implicitos y Explicitos.

                                                             CURSORES IMPLICITOS
Declaración de cursores implicitos.
Los cursores implicitos se utilizan para realizar consultas SELECT que devuelven un único registro.
Deben tenerse en cuenta los siguientes puntos cuando se utilizan cursores implicitos:
  • Con cada cursor implicito debe existir la palabra clave INTO.
  • Las variables que reciben los datos devueltos por el cursor tienen que contener el mismo tipo de dato que las columnas de la tabla.
  • Los cursores implicitos solo pueden devolver una única fila. En caso de que se devuelva más de una fila (o ninguna fila) se producirá una excepcion. No se preocupe si aún no sabe que es una excepcion, le valdrá conocer que es el medio por el que PL/SQL gestiona los errores.
   El siguiente ejemplo muestra un cursor implicito:


declare
vdescripcion VARCHAR2(
50);
begin SELECT DESCRIPCION
INTO vdescripcion
from PAISES
WHERE CO_PAIS =
'ESP';

dbms_output.put_line(
'La lectura del cursor es: ' || vdescripcion);

end;

    La salida del programa generaría la siguiente línea:


La lectura del cursor es: ESPAÑA


Excepciones asociadas a los cursores implicitos.
Los cursores implicitos sólo pueden devolver una fila, por lo que pueden producirse determinadas excepciones. Las más comunes que se pueden encontrar son no_data_found y too_many_rows.


                                                     CURSORES EXPLICITOS
Declaración de cursores explicitos
Los cursores explicitos se emplean para realizar consultas SELECT que pueden devolver cero filas, o más de una fila.
    Para trabajar con un cursor explicito necesitamos realizar las siguientes tareas:
  • Declarar el cursor.
  • Abrir el cursor con la instrucción OPEN.
  • Leer los datos del cursor con la instrucción FETCH.
  • Cerrar el cursor y liberar los recursos con la instrucción CLOSE.
    Para declarar un cursor debemos emplear la siguiente sintaxis:

   CURSOR nombre_cursor IS
     instrucción_SELECT 

    También debemos declarar los posibles parametros que requiera el cursor:

CURSOR nombre_cursor(param1 tipo1, ..., paramN tipoN) IS
     instrucción_SELECT 


    Para abrir el cursor

     OPEN nombre_cursor;
     o bien (en el caso de un cursor con parámetros)
     OPEN nombre_cursor(valor1, valor2, ..., valorN);


   
Para recuperar los datos en variables PL/SQL.

FETCH nombre_cursor INTO lista_variables;
-- o bien ...
FETCH nombre_cursor INTO registro_PL/SQL;


    Para cerrar el cursor:

  CLOSE nombre_cursor;

 El siguiente ejemplo ilustra el trabajo con un cursor explicito. Hay que tener en cuenta que al leer los datos del cursor debemos hacerlo sobre variables del mismo tipo de datos de la tabla (o tablas) que trata el cursor.

DECLARE 
  CURSOR cpaises 
  IS
  SELECT CO_PAIS, DESCRIPCION, CONTINENTE 
  FROM PAISES;
 


  co_pais VARCHAR2(3);
  descripcion VARCHAR2(50);
  continente  VARCHAR2(25);
BEGIN
  OPEN cpaises;
  FETCH cpaises INTO co_pais,descripcion,continente;
  CLOSE cpaises;
END;


Podemos simplificar el ejemplo utilizando el atributo de tipo %ROWTYPE sobre el cursor.

DECLARE 
  CURSOR cpaises 
  IS
  SELECT CO_PAIS, DESCRIPCION, CONTINENTE 
  FROM PAISES;
  
  registro cpaises%ROWTYPE;
BEGIN
  OPEN cpaises;
  FETCH cpaises INTO registro;
  CLOSE cpaises;
END; 


    El mismo ejemplo, pero utilizando parámetros:

DECLARE 
  CURSOR cpaises (p_continente VARCHAR2) 
  IS
  SELECT CO_PAIS, DESCRIPCION, CONTINENTE 
  FROM PAISES
  WHERE CONTINENTE = p_continente;
  
  registro cpaises%ROWTYPE;
BEGIN
  OPEN cpaises('EUROPA');
  FETCH cpaises INTO registro;
  CLOSE cpaises;
END; 


     Cuando trabajamos con cursores debemos considerar:
  • Cuando un cursor está cerrado, no se puede leer.
  • Cuando leemos un cursor debemos comprobar el resultado de la lectura utilizando los atributos de los cursores.
  • Cuando se cierra el cursor, es ilegal tratar de usarlo.
  • Es ilegal tratar de cerrar un cursor que ya está cerrado o no ha sido abierto.




3 comentarios:

  1. la informacion de este blog la sacaste de http://www.devjoker.com/ se mas creativo/a

    ResponderBorrar
  2. la informacion de este blog la sacaste de http://www.devjoker.com/ se mas creativo/a

    ResponderBorrar
  3. yo tengo un script de limpieza de datos

    ResponderBorrar