Saltar la navegación

3.3.2.- Cursores variables.

Ilustración en la que se ven tres monos en primer plano y uno de ellos está señalando con el dedo.
ITE (Abraham Pérez Pérez) (Uso educativo nc)



Oracle, además de los cursores vistos anteriormente, nos permite definir cursores variables que son como punteros a cursores, por lo que podemos usarlos para referirnos a cualquier tipo de consulta. Los cursores serían estáticos y los cursores variables serían dinámicos.

Para declarar un cursor variable debemos seguir 2 pasos:

  • Definir un tipo REF CURSOR y entonces declarar una variable de ese tipo.
    TYPE tipo_cursor IS REF CURSOR RETURN agentes%ROWTYPE;
    cAgentes tipo_cursor;
    
    
  • Una vez definido el cursor variable debemos asociarlo a una consulta (notar que esto no se hace en la parte declarativa, sino dinámicamente en la parte de ejecución) y esto lo hacemos con la sentencia OPEN-FOR utilizando la siguiente sintaxis:
    OPEN nombre_variable_cursor FOR sentencia_select;
    OPEN cAgentes FOR SELECT * FROM agentes WHERE oficina = 1;

    Un cursor variable no puede tomar parámetros. Podemos usar los atributos de los cursores para cursores variables.

Además, podemos usar varios OPEN-FOR para abrir el mismo cursor variable para diferentes consultas. No necesitamos cerrarlo antes de reabrirlo. Cuando abrimos un cursor variable para una consulta diferente, la consulta previa se pierde.

Una vez abierto el cursor variable, su manejo es idéntico a un cursor. Usaremos FETCH para traernos las filas, usaremos sus atributos para hacer comprobaciones y lo cerraremos cuando dejemos de usarlo.

DECLARE
TYPE cursor_Agentes IS REF CURSOR RETURN agentes%ROWTYPE;
cAgentes cursor_Agentes;
agente cAgentes%ROWTYPE;
BEGIN
...
OPEN cAgentes FOR SELECT * FROM agentes WHERE oficina = 1;
LOOP
     FETCH cAgentes INTO agente;
     EXIT WHEN cAgentes%NOTFOUND;
     ...
END LOOP;
CLOSE cAgentes;
...
END;
También puede utilizarse el bucle FOR con cursores variable definidos dentro del mismo bucle:
for va_cursor in (select ...) loop
...
end loop;

Autoevaluación

Pregunta

A los cursores variables no podemos pasarles parámetros al abrirlos.

Respuestas

Verdadero.

Falso.

Retroalimentación


Pregunta

Los cursores variables se abren exactamente igual que los cursores explícitos.

Respuestas

Verdadero.

Falso.

Retroalimentación