sábado, 14 de junio de 2014

TAREA 7 - USO DE CURSOR.

CURSORES EXPLICITOS EN PL/SQL.

 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 leberar 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 parámetros 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.

**Atributos de los Cursores.
    Toman los valores TRUE, FALSE o NULL dependiendo de la situación:
      - Antes de abrir;
             %NOTFOUND ORA-1001 NULL FALSE TRUE ORA-1001
      - Al abrir durante la recuperación;
             %FOUND ORA-1001 NULL TRUE FALSE ORA-1001
      - Al finalizar la recuperación;
             %ISOPEN FALSE TRUE TRUE TRUE FALSE
      - Después de cerrar;
             %ROWCOUNT ORA-1001  0 *  ** ORA-1001

          *     Número de registros que ha recuperado hasta el momento.
          **   Número de total de registros.


*** Manejo del Cursor
   Por medio del Ciclo LOOP podemos iterar a través del Cursor. Debe tenerse cuidado de agregar una condición para salir del bucle:
 Veremos varias formas de iterar a tráves de un Cursor;

1. Utilizando Bucle LOOP, con una sentencia EXIT condicionada.

    OPEN nombre_cursor;
    LOOP
    FETCH nombre_cursor INTO lista_variables;
    EXIT WHEN nombre_cursor%NOTFOUND;
    */Procedimiento de los registros recuperados*/
    END LOOP;
    CLOSE nomnre_cursor;

Aplicado a nuestro ejemplo;

    DECLARE
    CURSOR cpaises
    IS
    SELECT co_pais, descripcion, continente
    FROM paises;

    co_pais VARCHAR2(3);
    descripcion VARCHAR2(50);
    continente VARCHAR2(25);
    BEGIN
    OPEN cpaises;
    LOOP
    FETCH cpaises INTO co_pais, descripcion, continente;  
    EXIT WHEN cpaises%NOTFOUND;
    dbms_output.put_line(descripcion);
    END LOOP;
    CLOSE cpaises;
    END;


2. Utilizando Bucle WHILE LOOP, con la instrucción FETCH aparece dos veces.

    OPEN nombre_cursor;
    FETCH nombre_cursor INTO lista_variables;
    WHILE nombre_cursor%FOUND
    LOOP
    */Procedimiento de los registros recuperados*/
    FETCH nombre_cursor INTO lista_variables;
    END LOOP;
    CLOSE nombre_cursor;

Aplicado a nuestro ejemplo;

    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;
    WHILE cpaises%FOUND;
    LOOP;
    dbms_output.put_line(descripcion);
    FETCH cpaises INTO co_pais, descripcion, continente;
    END LOOP;
    CLOSE cpaises;
    END;


3. Utilizando Bucle FOR LOOP. Esta es la forma más corta ya que el Cursor es implicitamente se ejecutan las instrucciones OPEN, FETCH y CLOSE.

    FOR variable IN nombre_cursor LOOP
    */Procedimiento de los registros recuperados*/
    END LOOP;

Aplicado a nuestro ejemplo;

    BEGIN
    FOR reg IN (SELECT*FROM paises)
    LOOP
    dbms_output.put_line(descripcion);
    END LOOP;
    END;


No hay comentarios:

Publicar un comentario