Как использовать явный курсор с FETCH в цикле и вне его?

Есть вопрос, в котором я бы хотел лучше разобраться.

Когда мы создаем курсор и в BEGIN начитаем его выполнять:

begin
    open c_cursor;
    fetch c_cursor into r_cursor;
    loop 
    ......
    end loop;
end;

Когда я использую FETCH вне цикла, оно только 1 раз записывает в r_cursor и дальше в цикле я буду работать только с этой одной записью?

А если буду его использовать в цикле, тогда оно будет каждую строчку с курсора записывать в запись, и буду каждой итерации работать с новой строкой. Правильно ли понимаю?


Ответы (1 шт):

Автор решения: 0xdb

Ниже простейший пример для понимания работы с явным крсором, когда в цикле, а когда вне его.

  • в #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;
/
→ Ссылка