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;
FOR
con cursores variable definidos dentro del mismo bucle:
for va_cursor in (select ...) loop
...
end loop;