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

Come utilizzare record per eseguire il loop di un cursore di riferimento?

Non è possibile definire un tipo di record basato su un REF CURSOR con tipizzazione 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 recuperare i dati.

Se si conoscono i dati effettivi restituiti dalla funzione, è possibile dichiarare un record di quel tipo in cui recuperare i dati. Ad esempio, se dichiaro una funzione che restituisce un tipo di cursore debolmente digitato ma so che il cursore restituisce davvero un cursore basato su EMP tabella, posso recuperare i dati in un EMP%ROWTYPE record (notare che SYS_REFCURSOR è un tipo REF CURSOR debolmente tipizzato definito dal sistema)

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;