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

PLS-00221:„C1“ (Cursor) ist keine Prozedur oder nicht definiert

Sie scheinen explizite Cursor verwechselt zu haben, z. B.:

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

mit einem Ref-Cursor - der ein Zeiger auf einen offenen Cursor ist.

Sie würden normalerweise einen ref-Cursor verwenden, um einen Cursor in der Datenbank zu öffnen und ihn an die aufrufende App zurückzugeben, damit er eine Schleife durchläuft.

Die Art und Weise, wie Sie die ref-Cursor als Ausgangsparameter deklariert haben und dann versucht haben, sie in derselben Prozedur zu durchlaufen, ist nicht sinnvoll - sobald Sie einen Datensatz von einem Cursor abgerufen haben, können Sie ihn nicht erneut abrufen.

Wenn Sie unbedingt einen Ref-Cursor durchlaufen müssen, verwenden Sie diese Art von Syntax:

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;
/

aber wie ich schon sagte, würden Sie im Allgemeinen keine Ref-Cursor in der Datenbank durchlaufen, sondern im aufrufenden Code.

Wenn Sie Ihre Frage mit den Anforderungen, die Sie zu erfüllen versuchen, aktualisiert haben, könnten wir vielleicht einen besseren Weg vorschlagen, dies zu tun.