Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

PLS-00221:'C1'(cursor) não é um procedimento ou está indefinido


Você parece ter cursores explícitos confusos, por exemplo:
declare
  cursor cur is
  select dummy from dual;
begin
  for rec in cur
  loop
    dbms_output.put_line(rec.dummy);
  end loop;
end;
/

com um cursor ref - que é um ponteiro para um cursor aberto.

Você normalmente usaria um cursor ref para abrir um cursor no banco de dados e passá-lo de volta para o aplicativo de chamada para que ele faça um loop.

A maneira como você declarou os cursores ref como parâmetros de saída e, em seguida, tentou percorrê-los no mesmo procedimento não faz sentido - depois de buscar um registro de um cursor, você não pode buscá-lo novamente.

Se você absolutamente precisar percorrer um cursor ref, usaria este tipo de sintaxe:
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;
/

mas como eu disse, em geral, você não estaria percorrendo os cursores ref no banco de dados, você estaria fazendo isso no código de chamada.

Talvez, se você atualizou sua pergunta com os requisitos que está tentando atender, possamos sugerir uma maneira melhor de fazer isso.