viernes, 4 de mayo de 2012

Tarea 3 - Cursores Explicitos en PL/SQL


Declaración de cursores explícitos.

1.    Declaración del cursor: lo tenemos que declarar en la zona de declaraciones, con el siguiente formato: CURSOR <nombrecursor> IS <sentencia SELECT>;
2.    Apertura del cursor: Deberá colocarse en la zona de instrucciones, con el siguiente formato: OPEN <nombrecursor>; 
Al hacerlo se ejecuta automáticamente la sentencia select y sus resultados se almacenan en las estructuras internas de memoria manejadas por el cursor.
3.    Recogida de información: Para recuperar la información anteriormente guardada en las estructuras de memoria interna tenemos que usar el siguiente formato: 
FETCH <nombrecursor> INTO {<variable> | <listavariables>}; 
Si tenemos una única variable que recoge los datos de todas las columnas, el formato de la variable seria el siguiente:
  <variable> <nombrecursor>%ROWTYPE; 
Si tenemos una lista de variables, cada una recogerá la columna correspondiente de la cláusula select, por lo que serán del mismo tipo que las columnas.
4.    - Cierre del cursor:  CLOSE <nombrecursor>;
OPEN nombre_cursor;
    LOOP
        FETCH nombre_cursor INTO lista_variables;
        EXIT WHEN nombre_cursor%NOTFOUND;
        /* Procesamiento de los registros recuperados */
    END LOOP;
CLOSE nombre_cursor;

Atributos del cursor


Detalles de la situación del cursor tenemos 4 atributos:
  • %FOUND: devuelve verdadero di el último FETCH ha recuperado algún valor; en caso contrario devuelve falso; si el cursor no está abierto nos devuelve error.
  • %NOTFOUND: hace justamente lo contrario al anterior.
  • %ROWCOUNT: nos devuelve el número de filas recuperadas hasta el momento.
  • %ISOPEN: devuelve verdadero si el cursor está abierto.

Manejo del cursor 

Bucle LOOP con una sentencia EXIT condicionada

DECLARE

  cursor CursorLoop IS SELECT employee_id,first_name,email FROM employees;

  vid employees.employee_id%TYPE;

  vfirst_name employees.first_name%TYPE;

  vemail employees.email%TYPE;

BEGIN

  OPEN CursorLoop;

    LOOP

      FETCH CursorLoop INTO vid,vfirst_name,vemail;

      EXIT WHEN CursorLoop %NOTFOUND;

      dbms_output.put_line('Id: '||vid||' |Nombre: '||vfirst_name||' |Email:'||vemail);

    END LOOP;

  CLOSE CursorLoop;

  EXCEPTION

    WHEN OTHERS THEN

      dbms_output.put_line('Error: '||SQLERRM);

END;

Bucle WHILE LOOP 

DECLARE
  cursor CursorWhile IS SELECT employee_id,first_name,email FROM employees;
  vid employees.employee_id%TYPE;
  vfirst_name employees.first_name%TYPE;
  vemail employees.email%TYPE;
BEGIN
  OPEN CursorWhile;
    FETCH CursorWhile INTO vid,vfirst_name,vemail;
    WHILE CursorWhile%FOUND
      LOOP       
        dbms_output.put_line('Id: '||vid||' |Nombre: '||vfirst_name||' |Email:'||vemail);
        FETCH CursorWhile INTO vid,vfirst_name,vemail;
      END LOOP;
  CLOSE CursorWhile;
  EXCEPTION
    WHEN OTHERS THEN
      dbms_output.put_line('Error: '||SQLERRM);
END;

Bucle FOR LOOP 

DECLARE
  cursor CursorFor IS SELECT employee_id,first_name,email FROM employees;
BEGIN
  FOR employee_rec IN CursorFor
    LOOP
      dbms_output.put_line('Id: '||employee_rec.employee_id||' |Nombre: '||employee_rec.first_name||' |Email: '||employee_rec.email);
    END LOOP;
  EXCEPTION
    WHEN OTHERS THEN
      dbms_output.put_line('Error: '||SQLERRM);
END;

No hay comentarios:

Publicar un comentario