sql >> Databáze >  >> RDS >> Oracle

PLS-00221:'C1' (kurzor) není procedura nebo není definováno

Zdá se, že máte zmatené explicitní kurzory, např.:

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

s referenčním kurzorem - což je ukazatel na otevřený kurzor.

Obvykle byste použili referenční kurzor k otevření kurzoru v db a předali jej zpět volající aplikaci, aby prošla smyčkou.

Způsob, jakým jste deklarovali refkurzory jako out parametry a pak jste se je pokusili procházet ve stejném postupu, nedává smysl – jakmile načtete záznam z kurzoru, nemůžete jej znovu načíst.

Pokud bezpodmínečně musíte procházet referenční kurzor, použijete tento druh 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;
/

ale jak jsem řekl, obecně byste neprocházeli referenční kurzory v db, ale dělali byste to ve volacím kódu.

Možná, že pokud svou otázku aktualizujete o požadavky, které se snažíte splnit, mohli bychom navrhnout lepší způsob, jak toho dosáhnout.




  1. SQLAlchemy:Vytvořte odstraňovací dotaz pomocí self-join na MySQL

  2. Odesílání typu NULL při aktualizaci více řádků

  3. Porovnání řetězců UTF8 v MySQL

  4. Mocha testování PostgreSQL pomocí Knex mi dává chybu MigrationLocked