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

¿Cómo se obtienen resultados bien formateados de un procedimiento de Oracle que devuelve un cursor de referencia?

Si GetQuestions es una función que devuelve un refcursor, que parece ser lo que tiene en la versión de SQL Server, entonces puede hacer algo como esto:

select * from table(MyPackage.GetQuestions('OMG Ponies'));

O si lo necesita en un bloque PL/SQL, puede usar la misma selección en un cursor.

También puede hacer que la función produzca el dbms_output declaraciones en su lugar para que siempre estén disponibles para la depuración, aunque eso agrega un poco de sobrecarga.

Editar

Hmmm, no estoy seguro de que sea posible cast() el refcursor devuelto a un tipo utilizable, a menos que esté dispuesto a declarar su propio tipo (y una tabla de ese tipo) fuera del paquete. Sin embargo, puede hacer esto, solo para volcar los 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;

Y puede usar el resultado de la llamada en otro procedimiento o función; es solo llegar fuera de PL/SQL que parece ser un poco complicado.

Editado para agregar: Con este enfoque, si se trata de un procedimiento, puede hacer esencialmente lo mismo:

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