Oracle
 sql >> Database >  >> RDS >> Oracle

Come si ottengono risultati ben formattati da una procedura Oracle che restituisce un cursore di riferimento?

Se GetQuestions è una funzione che restituisce un refcursor, che sembra essere quello che hai nella versione di SQL Server, quindi potresti essere in grado di fare qualcosa del genere:

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

Oppure, se ne hai bisogno in un blocco PL/SQL, puoi utilizzare la stessa selezione in un cursore.

Puoi anche fare in modo che la funzione produca il dbms_output istruzioni invece in modo che siano sempre disponibili per il debug, anche se ciò aggiunge un po' di sovraccarico.

Modifica

Hmmm, non sono sicuro che sia possibile cast() il riferimento restituito a un tipo utilizzabile, a meno che tu non sia disposto a dichiarare il tuo tipo (e una tabella di quel tipo) al di fuori del pacchetto. Puoi farlo solo per scaricare i risultati:

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 puoi usare il risultato della chiamata in un'altra procedura o funzione; è solo arrivarci al di fuori di PL/SQL che sembra essere un po' complicato.

Modificato per aggiungere: Con questo approccio, se si tratta di una procedura, puoi fare essenzialmente la stessa cosa:

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