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?

È stato utile?

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top