Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment utiliser record pour boucler un curseur ref?

Vous ne pouvez pas définir un type d'enregistrement basé sur un REF CURSOR faiblement typé. Étant donné que le type de curseur défini dans le package peut être utilisé pour renvoyer des données à partir d'une requête arbitraire avec des colonnes arbitraires, le compilateur PL/SQL ne peut pas déterminer un type d'enregistrement approprié dans lequel extraire les données.

Si vous connaissez les données réelles renvoyées par la fonction, vous pouvez déclarer un enregistrement de ce type dans lequel extraire les données. Par exemple, si je déclare une fonction qui renvoie un type de curseur faiblement typé mais que je sais que le curseur renvoie réellement un curseur basé sur le EMP table, je peux récupérer les données dans un EMP%ROWTYPE record (notez que SYS_REFCURSOR est un type REF CURSOR faiblement typé défini par le système)

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;