Как использовать явный курсор с FETCH в цикле и вне его?
Есть вопрос, в котором я бы хотел лучше разобраться.
Когда мы создаем курсор и в BEGIN начитаем его выполнять:
begin
open c_cursor;
fetch c_cursor into r_cursor;
loop
......
end loop;
end;
Когда я использую FETCH вне цикла, оно только 1 раз записывает в r_cursor и дальше в цикле я буду работать только с этой одной записью?
А если буду его использовать в цикле, тогда оно будет каждую строчку с курсора записывать в запись, и буду каждой итерации работать с новой строкой. Правильно ли понимаю?
Ответы (1 шт):
Ниже простейший пример для понимания работы с явным крсором, когда в цикле, а когда вне его.
- в #1 идёт обработка одной записи считаной в FETCH в цикле
- в #2 идёт считвание всех записей в
FETCHс последующей обработкой записей в цикле
С явным курсором можно считать одну запись вне цикла, но так делать не стоит, для этого существуют неявные курсоры, работать с которыми проще и смысл объявления явного курсора теряется.
declare
cursor cur is
select 'row '||rownum id
from dual connect by level<=9;
rec cur%rowtype;
type rectab is table of cur%rowtype;
recs rectab;
begin
--#1
open cur;
loop
fetch cur into rec;
exit when cur%notfound;
-- processing data of one rec
end loop;
close cur;
--#2
open cur;
fetch cur bulk collect into recs;
close cur;
for i in 1..recs.count loop
null; -- processing data of one element of recs
end loop;
end;
/