Cursores Externos (Ref Cursor)



En algunos desarrollos necesitamos que una consulta (Cursor) sea utilizada en más de un procedimiento o función, para esto realizamos un refCursor,  esto es una función la cual retorna una consulta por medio del tipo de variable SYS_REFCURSOR.

Ejemplo: Se necesita retornar los valores que contiene la tabla dummy utilizando un refCursor.
--Creación de la función que contiene el select
create or replace function prueba_ref_cursor return SYS_REFCURSOR is

      cursorRetornado SYS_REFCURSOR;

begin

   open cursorRetornado for --Abre la consulta
   select dummy
   from dual;

   return cursorRetornado; --retorna la consulta

end prueba_ref_cursor;

En este bloque anónimo se realiza el llamado a al refCursor, para esto se utilizan las instrucciones del cursor Fetch, Into y Close, la instrucción Open se ejecuta en el refCursor.

--Llamado de la funcion refCursor para ejecutar el paquete.
declare
  tipo_Cursor  sys_refcursor := null;
  valor_cursor varchar2(100);
begin

  tipo_Cursor := prueba_ref_cursor();--Open cursor
  LOOP --Inicia el llop
   
    FETCH tipo_Cursor INTO valor_cursor; --Pasa los valores a valor_cursor
    EXIT WHEN tipo_Cursor%NOTFOUND; --Indica la salida del loop
   
    DBMS_OUTPUT.PUT_LINE(valor_cursor); --Imprime el valor
 
  END LOOP; --Fin del loop

  close tipo_Cursor; --Se cierra el cursor
end;

Output: