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

PLS-00221:'C1'(cursore) non è una procedura o non è definito

Sembra che tu abbia confuso i cursori espliciti, ad esempio:

declare
  cursor cur is
  select dummy from dual;
begin
  for rec in cur
  loop
    dbms_output.put_line(rec.dummy);
  end loop;
end;
/

con un cursore di riferimento - che è un puntatore a un cursore aperto.

In genere utilizzeresti un cursore di riferimento per aprire un cursore nel db e passarlo di nuovo all'app chiamante per farlo scorrere.

Il modo in cui hai dichiarato i cursori di riferimento come parametri out e poi hai provato a scorrerli nella stessa procedura non ha senso:una volta che hai recuperato un record da un cursore, non puoi recuperarlo di nuovo.

Se devi assolutamente scorrere un cursore di riferimento, utilizzeresti questo tipo di sintassi:

declare
  cur sys_refcursor;
  rec dual%rowtype;
begin
  open cur for select dummy from dual;
  loop
    fetch cur into rec;
    exit when cur%notfound;
    dbms_output.put_line(rec.dummy);
  end loop;
end;
/

ma come ho detto, in generale, non avresti eseguito il loop dei cursori di riferimento nel db, lo faresti nel codice chiamante.

Forse se hai aggiornato la tua domanda con i requisiti che stai cercando di soddisfare, potremmo suggerirti un modo migliore per farlo.