Для работы со строками, извлекаемыми из результирующего множества “многострочного” запроса посредством курсора необходимо выполнить три операции: открыть курсор (OPEN), считать информацию в ранее объявленные переменные (FETCH) и закрыть курсор (CLOSE). Например:
declare
cursor parts_cur is
select * from parts;
current_part parts %rowtype;
begin
open parts_cur;
loop
fetch parts_cur into current_part;
…другие операторы…
end loop;
close part_cur;
…
Когда в программе открывается курсор, имеющий курсорные параметры, можно указывать значение для каждого такого параметра. Например, в следующей программе определяется результирующее множество курсора, включающее все записи о клиентах, проживающих в России.
declare
cursor customers_cursor (state_id char) is
select * from sales.customers
where state = state_id;
begin
open parts_cursor (‘RU’);
…
В программе PL/SQL можно использовать несколько уникальных курсорных атрибутов – %ISOPEN, %FOUND, %NOTFOUND и %ROWCOUNT – для принятия решения во время обработки курсоров. В таблице 4 приведен список доступных в PL/SQL курсорных атрибутов с описанием.
Таблица 4 Курсорные атрибуты
Курсорный атрибут
Описание
%ISOPEN
Возвращает TRUE, если курсор открыт.
%ROWCOUNT
Возвращает число строк, содержащихся в курсоре после открытия курсора.
%NOTFOUND
Принимает значение TRUE, после того как из курсора вычитана последняя строка.
%FOUND
Принимает значение FALSE, после того как из курсора вычитана последняя строка.
В нижеследующем примере, применяется курсорный атрибут %FOUND для определения момента завершения цикла.
while parts_cursor %found
loop
fetch parts_cursor into current_part;
... другие операторы ...
end loop;
При выборе определенных строк из результирующего множества курсора важно понятие текущей строки. Программы PL/SQL в операторах UPDATE и DELETE, которые должны обрабатывать текущую строку курсора, могут применять специальный синтаксис CURRENT OF.
Для упрощения необходимых при установке и обработке курсоров можно пользоваться курсорными циклами FOR:
declare
cursor parts_cur is
select * from parts;
begin
for current_part in parts_cur
loop
…другие операторы…
end loop;
В курсорном цикле FOR автоматически объявляется переменная или запись с помощью, которой можно считывать записи, открывать курсор, выбирать из него строки и закрывать курсор, когда из него выбирается последняя строка.