sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo escribo un procedimiento almacenado que agrega una columna a un cursor de referencia de otro procedimiento almacenado?

Una posible solución (que eventualmente podría simplificarse) es usar una función de tabla para procesar el cursor y agregar el valor de la función.

Suponga que la función que devuelve el sys_refcursor se llama get_cur y que el cursor consiste en la columna ID, NAME (esto es importante, ya que la función de tabla requiere una definición de tipo).

Declara el TIPO para la fila (incluida la columna de ruta adicional) y para la tabla resultante.

create type t_row is object
 ( id             number(10),
   name varchar2(10),
   path varchar2(10)
);
/

create type t_rows is table of t_row;
/

y defina la función de la tabla recuperando el cursor y agregando la llamada a la función.

create or replace function get_cur2  return 
t_rows
PIPELINED
as
   cv_out     sys_refcursor;
   id   number;
   name   varchar2(100);    
begin
      cv_out := get_cur; 
      loop 
        FETCH cv_out INTO id, name;
        exit when cv_out%NOTFOUND;
        pipe row(t_row(id,name, GetRegionPath(id)));
      end loop;
      close    cv_out;
      return;
end;
/

Ahora puede seleccionar los datos de la función de tabla

select * from  table(get_cur2); 

        ID NAME       PATH     
---------- ---------- ----------
         1 one        path 1     
         2 two        path 2 

y, por supuesto, puede usar esta consulta para abrir un cursor en una tercera función que devolverá SYS_REFCURSOR con la columna de ruta adicional.