Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie verwendet man record, um einen Ref-Cursor zu loopen?

Sie können keinen Datensatztyp basierend auf einem schwach typisierten REF CURSOR definieren. Da der im Paket definierte Cursortyp verwendet werden kann, um Daten aus einer beliebigen Abfrage mit beliebigen Spalten zurückzugeben, kann der PL/SQL-Compiler keinen geeigneten Datensatztyp zum Abrufen der Daten ermitteln.

Wenn Sie die tatsächlichen Daten kennen, die von der Funktion zurückgegeben werden, können Sie einen Datensatz dieses Typs deklarieren, in den die Daten abgerufen werden. Wenn ich zum Beispiel eine Funktion deklariere, die einen schwach typisierten Cursortyp zurückgibt, aber ich weiß, dass der Cursor wirklich einen Cursor zurückgibt, der auf dem EMP basiert Tabelle kann ich die Daten in einen EMP%ROWTYPE holen Datensatz (beachten Sie, dass SYS_REFCURSOR ist ein vom System definierter schwach typisierter REF CURSOR-Typ)

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;