Oracle
 sql >> Baza danych >  >> RDS >> Oracle

PLS-00221:„C1” (kursor) nie jest procedurą lub jest niezdefiniowany

Wygląda na to, że pomyliłeś wyraźne kursory, np.:

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

z kursorem ref - który jest wskaźnikiem do otwartego kursora.

Zwykle użyjesz kursora ref, aby otworzyć kursor w bazie danych i przekazać go z powrotem do aplikacji wywołującej, aby mogła przejść przez nią w pętli.

Sposób, w jaki zadeklarowałeś kursory referencyjne jako parametry wyjściowe, a następnie próbowałeś przejść przez nie w pętli w tej samej procedurze, nie ma sensu - po pobraniu rekordu z kursora nie możesz go ponownie pobrać.

Jeśli koniecznie musisz przejść przez kursor ref, użyj tego rodzaju składni:

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 powiedziałem, ogólnie rzecz biorąc, nie będziesz przechodził przez kursory ref w bazie danych, zrobiłbyś to w kodzie wywołującym.

Być może po zaktualizowaniu swojego pytania o wymagania, które próbujesz spełnić, możemy zaproponować lepszy sposób na zrobienie tego.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dzielenie ciągu oddzielonego przecinkami w Oracle nie działa

  2. Po nawiązaniu połączenia z Oracle w pakiecie bezpieczeństwa nie są dostępne żadne dane uwierzytelniające

  3. Sprawdź, czy tabela istnieje w bazie danych - PL SQL

  4. Uciekanie znaków kontrolnych w Oracle XDB

  5. zatwierdź po wybraniu