Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment obtenir des résultats bien formatés à partir d'une procédure Oracle qui renvoie un curseur de référence ?

Si GetQuestions est une fonction renvoyant un refcursor, qui semble être ce que vous avez dans la version SQL Server, alors vous pourrez peut-être faire quelque chose comme ceci :

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

Ou si vous en avez besoin dans un bloc PL/SQL, vous pouvez utiliser la même sélection dans un curseur.

Vous pouvez également faire en sorte que la fonction produise le dbms_output à la place afin qu'elles soient toujours disponibles pour le débogage, bien que cela ajoute un peu de surcharge.

Modifier

Hmmm, pas sûr qu'il soit possible de cast() le refcursor renvoyé à un type utilisable, à moins que vous ne souhaitiez déclarer votre propre type (et une table de ce type) en dehors du package. Vous pouvez le faire cependant, juste pour vider les résultats :

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;

Et vous pouvez utiliser le résultat de l'appel dans une autre procédure ou fonction; c'est juste l'accès en dehors de PL/SQL qui semble être un peu délicat.

Modifié pour ajouter : Avec cette approche, s'il s'agit d'une procédure, vous pouvez faire essentiellement la même chose :

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