Crear cursores (Cursor) en PL/SQL



Los cursores son sentencias SQL select  que se utilizan dentro de bloques PL/SQL para realizar consulta a bases de datos. 

Sentencia base:

Cursor nombre_cursor (variable tipo_dato) is --Se crea el cursor
  Select * --Sentencia select
  From nombre_tabla;

El cursor se debe crear en la  declaración del bloque sea un procedimiento, función o bloque anónimo,  un bloque puede contener uno o más cursores, para dar uso a un cursor este se puede hacer utilizando la sentencia OPEN, FETCH, INTO y CLOSE.

OPEN: Indica que se abre el cursor.
FECTH: Prepara el cursor para obtener los valores por registro.
INTO: Variable en la cual se va a almacenar el valor recuperado por el fetch.
CLOSE: Cierra el cursor.

Ejemplo: Se requiere conocer el nombre de todos los empleados que ingresaron este año a la empresa.

Declare
  --Se declara el cursor
  Cursor cur_nombres is
    Select nombre
     From empleados
   Where to_char(fecha,’YYYY’)  = to_char(sysdate,’YYYY’);
    Nombre varchar2(200);

Begin

  OPEN cur_nombres; --abre el cursor
    Loop  --Ciclo que recorre el cursor

      FECTH cur_nombres INTO Nombre; --Pasa registro a registro el nombre encontrado
      Exit when  cur_nombres%notfound; --Indica que si no tiene datos el cursor salga del ciclo
      Dbms_output.put_line(Nombre); --Imprime el resultado

    End loop; --Fin del ciclo
  CLOSE cur_nombres; --Cierra el cursor

End;

Un cursor no puede realizar la función FETCH si no se ha realizado la función OPEN, y tampoco puede intentar volver a abrirse (OPEN) si aún no se ha realizado la sentencia CLOSE, en ambos casos el cursor genera un error.

Otra forma de recorrer un cursor es utilizando la sentencia FOR LOOP.

Declare
  Cursor cur_nombres is
    Select nombre
     From empleados
    Where to_char(fecha,’YYYY’)  = to_char(sysdate,’YYYY’);
    Nombre varchar2(200);
Begin
  FOR nombre IN cur_nombres LOOP
    Dbms_output.put_line(Nombre);
  END LOOP;
End;

1 comentario:

  1. :o gracias por éste gran aporte... soy nueva en plsql, hoy gracias a su blog he comprendido cómo funcionan los cursores.

    ResponderEliminar