Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como escrevo um procedimento armazenado que adiciona uma coluna a um cursor de referência de outro procedimento armazenado?


Uma solução possível (que poderia eventualmente ser simplificada) é usar uma função de tabela para processar o cursor e adicionar o valor da função.

Suponha que a função que retorna o sys_refcursor seja chamada get_cur e que o cursor consiste na coluna ID, NAME (isso é importante, pois a função de tabela requer definição de tipo).

Você declara o TYPE para a linha (incluindo a coluna de caminho adicional) e para a tabela 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;
/

e defina a função de tabela buscando o cursor e adicionando a chamada de função.
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;
/

Agora você pode selecionar os dados da função de tabela
select * from  table(get_cur2); 

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

e é claro que você pode usar esta consulta para abrir um cursor em uma terceira função que retornará o SYS_REFCURSOR com a coluna de caminho adicional.