sql >> Base de Datos >  >> RDS >> Oracle

PLS-00221:'C1' (cursor) no es un procedimiento o no está definido

Parece que has confundido los cursores explícitos, por ejemplo:

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 cursor de referencia, que es un puntero a un cursor abierto.

Por lo general, usaría un cursor de referencia para abrir un cursor en la base de datos y devolverlo a la aplicación de llamada para que se repita.

La forma en que ha declarado los cursores de referencia como parámetros de salida y luego ha intentado recorrerlos en el mismo procedimiento no tiene sentido:una vez que ha obtenido un registro de un cursor, no puede volver a obtenerlo.

Si absolutamente debe recorrer un cursor de referencia, usaría este tipo de sintaxis:

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

pero como dije, en general, no estaría recorriendo los cursores de referencia en la base de datos, estaría haciendo eso en el código de llamada.

Quizás si actualizó su pregunta con los requisitos que está tratando de cumplir, podríamos sugerirle una mejor manera de hacerlo.