Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie erhalten Sie schön formatierte Ergebnisse aus einer Oracle-Prozedur, die einen Referenzcursor zurückgibt?

Wenn GetQuestions eine Funktion ist, die einen Refcursor zurückgibt, was anscheinend das ist, was Sie in der SQL Server-Version haben, dann können Sie vielleicht eher so etwas tun:

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

Oder wenn Sie es in einem PL/SQL-Block brauchen, können Sie dasselbe select in einem Cursor verwenden.

Sie können auch die Funktion dbms_output erzeugen lassen -Anweisungen, sodass sie immer zum Debuggen verfügbar sind, obwohl dies etwas Overhead hinzufügt.

Bearbeiten

Hmmm, ich bin mir nicht sicher, ob es möglich ist, cast() zu verwenden den zurückgegebenen Refcursor auf einen verwendbaren Typ, es sei denn, Sie sind bereit, Ihren eigenen Typ (und eine Tabelle dieses Typs) außerhalb des Pakets zu deklarieren. Sie können dies jedoch tun, nur um die Ergebnisse auszugeben:

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;

Und Sie können das Ergebnis des Aufrufs in einer anderen Prozedur oder Funktion verwenden; Es scheint nur etwas schwierig zu sein, außerhalb von PL/SQL darauf zuzugreifen.

Bearbeitet, um hinzuzufügen: Wenn es sich um eine Prozedur handelt, können Sie bei diesem Ansatz im Wesentlichen dasselbe tun:

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