Oracle
 sql >> база данни >  >> RDS >> Oracle

PLS-00221:'C1' (курсор) не е процедура или е недефиниран

Изглежда, че сте объркали изричните курсори, напр.:

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

с референтен курсор - който е указател към отворен курсор.

Обикновено бихте използвали референтен курсор, за да отворите курсор в db и да го върнете обратно към извикващото приложение, за да премине през него.

Начинът, по който сте декларирали референтните курсори като изходящи параметри и след това сте се опитали да преминете през тях в същата процедура, няма смисъл - след като сте извлекли запис от курсор, не можете да го извлечете отново.

Ако абсолютно трябва да преминете през референтен курсор, бихте използвали този вид синтаксис:

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

но както казах, по принцип няма да преминавате през референтните курсори в db, ще правите това в извикващия код.

Може би, ако актуализирате въпроса си с изискванията, които се опитвате да изпълните, бихме могли да предложим по-добър начин да го направите.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. подзаявката връща повече от един ред

  2. Възможно ли е да се създаде тип асоциативен масив на Oracle извън пакет/процедура?

  3. как да получите данни от една колона от една таблица в друга таблица като различни колони в PL/SQL

  4. Подизбор в Oracle

  5. Oracle SQL рекурсия за намиране на първи екземпляр на ненулева стойност на колона