Come utilizzare record per eseguire il loop di un cursore ref?
-
28-10-2019 - |
Domanda
Voglio scrivere PL / SQL per testare una funzione in un pacchetto.Il pacchetto definisce un tipo di cursore
TYPE ref_cursor IS REF CURSOR;
Voglio definire un record in base a quel tipo.
Il mio codice è:
DECLARE
cur PACKAGE_NAME.ref_cursor;
rec cur%ROWTYPE;
perché l'ultima riga non è corretta?
Soluzione
Non è possibile definire un tipo di record basato su un REF CURSOR di tipo debole.Poiché il tipo di cursore definito nel pacchetto può essere utilizzato per restituire dati da una query arbitraria con colonne arbitrarie, il compilatore PL / SQL non può determinare un tipo di record appropriato in cui caricare i dati.
Se conosci i dati effettivi restituiti dalla funzione, puoi dichiarare un record di quel tipo in cui recuperare i dati.Ad esempio, se dichiaro una funzione che restituisce un tipo di cursore debolmente tipizzato ma so che il cursore in realtà restituisce un cursore basato sulla tabella EMP
, posso recuperare i dati in un record EMP%ROWTYPE
(nota che SYS_REFCURSOR
è un codice definito dal sistematipo REF CURSOR di tipo debole)
create or replace function f1
return sys_refcursor
is
l_rc sys_refcursor;
begin
open l_rc
for select *
from emp;
return l_rc;
end;
declare
l_rc sys_refcursor;
l_emp emp%rowtype;
begin
l_rc := f1;
loop
fetch l_rc into l_emp;
exit when l_rc%notfound;
dbms_output.put_line( l_emp.empno );
end loop;
end;