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

Como você obtém resultados bem formatados de um procedimento Oracle que retorna um cursor de referência?


Se GetQuestions é uma função que retorna um refcursor, que parece ser o que você tem na versão do SQL Server, então você pode fazer algo assim:
select * from table(MyPackage.GetQuestions('OMG Ponies'));

Ou se você precisar dele em um bloco PL/SQL, poderá usar o mesmo select em um cursor.

Você também pode fazer com que a função produza o dbms_output em vez disso, para que estejam sempre disponíveis para depuração, embora isso acrescente um pouco de sobrecarga.

Editar

Hmmm, não tenho certeza se é possível cast() o refcursor retornado para um tipo utilizável, a menos que você queira declarar seu próprio tipo (e uma tabela desse tipo) fora do pacote. Você pode fazer isso, porém, apenas para despejar os resultados:
create package mypackage as
    function getquestions(user in varchar2) return sys_refcursor;
end mypackage;
/

create package body mypackage as
    function getquestions(user in varchar2) return sys_refcursor as
        r sys_refcursor;
    begin
        open r for
            /* Whatever your real query is */
            select 'Row 1' col1, 'Value 1' col2 from dual
            union
            select 'Row 2', 'Value 2' from dual
            union
            select 'Row 3', 'Value 3' from dual;
            return r;
    end;
end mypackage;
/

var r refcursor;
exec :r := mypackage.getquestions('OMG Ponies');
print r;

E você pode usar o resultado da chamada em outro procedimento ou função; é só chegar fora do PL/SQL que parece ser um pouco complicado.

Editado para adicionar: Com essa abordagem, se for um procedimento, você pode fazer essencialmente a mesma coisa:
var r refcursor;
exec mypackage.getquestions(:r, 'OMG Ponies');
print r;