Курсор для цикла в Oracle

пожалуйста, объясните мне, как использовать курсор для цикла в oracle.

Если я использую следующий код, все нормально.

for rec in (select id, name from students) loop
    -- do anything
end loop;

но если я определяю переменную для этой инструкции sql, она не работает.

v_sql := 'select id, name from students';

for rec in v_sql loop
    -- do anything
end loop;

ошибка: PLS-00103

4 ответов


для решения вопросов, связанных со вторым подходом в вашем вопросе вам нужно использовать

переменная курсора и явный способ открытия курсора и извлечения данных. Это не

разрешено использовать переменные курсора в FOR петли:

declare
  l_sql varchar2(123);        -- variable that contains a query
  l_c   sys_refcursor;        -- cursor variable(weak cursor). 
  l_res your_table%rowtype;   -- variable containing fetching data  
begin
  l_sql := 'select * from your_table';

  -- Open the cursor and fetching data explicitly 
  -- in the LOOP.

  open l_c for l_sql;

  loop
    fetch l_c into l_res;
    exit when l_c%notfound;   -- Exit the loop if there is nothing to fetch.

     -- process fetched data 
  end loop;

  close l_c; -- close the cursor
end;

узнать больше


попробуйте это :

cursor v_sql is
select id, name from students;

for rec in v_sql 
loop
    -- do anything
end loop;

тогда не надо open, fetch или close курсор.


вы нигде не выполняете эту строку sql. Просто сделайте это

v_sql := 'select id, name from students';
open cur for v_sql;
for rec in cur loop
    -- do anything
end loop;

или вы можете сделать это

cursor cur is select id, name from students;
open cur;
for rec in cur loop
        -- do anything
end loop;

или вы можете сделать это

for rec in (select id, name from students) loop
    -- do anything
end loop

вы должны использовать Refcursor, если вы делаете запрос во время выполнения. На самом деле refcursors указатели на запрос они не занимают места для строк, выбранных. Обычные курсоры для этого не годятся.

declare 
v_sql varchar2(200);
rec sys_refcursor;
BEGIN
v_sql := 'select id, name from students';

open rec for v_sql 
loop
fetch
exit when....
-- do anything
end loop;