Курсор для цикла в 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;