sql >> Databasteknik >  >> RDS >> Oracle

Hur får man snyggt formaterade resultat från en Oracle-procedur som returnerar en referensmarkör?

Om GetQuestions är en funktion som returnerar en refcursor, som verkar vara vad du har i SQL Server-versionen, så kanske du snarare kan göra något så här:

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

Eller om du behöver det i ett PL/SQL-block kan du använda samma val i en markör.

Du kan också låta funktionen producera dbms_output uttalanden istället så att de alltid är tillgängliga för felsökning, även om det lägger till lite extra kostnader.

Redigera

Hmmm, inte säker på att det är möjligt att cast() den returnerade återgången till en användbar typ, såvida du inte är villig att deklarera din egen typ (och en tabell av den typen) utanför paketet. Du kan dock göra detta, bara för att dumpa resultaten:

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;

Och du kan använda resultatet av samtalet i en annan procedur eller funktion; det är bara att komma till det utanför PL/SQL som verkar vara lite knepigt.

Redigerad för att lägga till: Med detta tillvägagångssätt, om det är en procedur, kan du göra i princip samma sak:

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


  1. använder (-) bindestreck i mysql-tabellnamnet

  2. Fixa "profilnamnet är inte giltigt" när du skickar e-post från SQL Server

  3. Ladda ner en kopia av din databas

  4. Lika med (=) mot LIKE för datumdatatyp