Oracle
 sql >> Base de données >  >> RDS >> Oracle

PLS-00221 :'C1' (curseur) n'est pas une procédure ou n'est pas défini

Vous semblez confondre les curseurs explicites, par exemple :

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

avec un curseur de référence - qui est un pointeur vers un curseur ouvert.

Vous utiliserez généralement un curseur de référence pour ouvrir un curseur dans la base de données et le retransmettre à l'application appelante pour qu'il boucle.

La façon dont vous avez déclaré les curseurs de référence comme paramètres de sortie, puis essayé de les parcourir dans la même procédure n'a pas de sens - une fois que vous avez récupéré un enregistrement à partir d'un curseur, vous ne pouvez pas le récupérer à nouveau.

Si vous devez absolument parcourir un curseur de référence, vous utiliserez ce type de syntaxe :

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

mais comme je l'ai dit, en général, vous ne feriez pas une boucle sur les curseurs de référence dans la base de données, vous le feriez dans le code appelant.

Peut-être que si vous mettez à jour votre question avec les exigences que vous essayez de remplir, nous pourrions suggérer une meilleure façon de le faire.