- •6. Управляющие структуры и обработка ошибок в pl/sql
- •6.1. Оператор if
- •6.2. Циклы
- •Цикл loop
- •Цикл while
- •Цикл for
- •6.3. Курсоры
- •Объявление курсора и атрибуты курсора
- •Записи pl/sql
- •Использование команд open, fetch и close
- •Курсорный цикл for
- •Предложение where с условием поиска current of
- •6.4. Использование вложенных циклов и курсоров
- •6.5. Обработка ошибок
- •Исключения
- •Системные исключения
- •Исключения, определяемые программистом
Цикл while
Еще одной разновидностью цикла является цикл WHILE. Он хорошо подходит в ситуациях, когда количество итераций заранее неизвестно и определяется некоторым внешним фактором. Цикл WHILE имеет следующий синтаксис:
WHILE условие_выхода
LOOP
операторы;
END LOOP;
Приведенный ниже пример использует цикл WHILE для печати первых десяти чисел:
DECLARE
just_a_num NUMBER := 1;
BEGIN
WHILE (just_a_num <= 10)
LOOP
dbms_output .put_line (just_a_num) ;
just_a_num := just_a_num + 1;
END LOOP;
END;
/
Условие WHILE проверяется перед каждым входом в цикл. Если оно имеет значение "истина", то выполняется очередная итерация.
Цикл for
В цикле FOR для подсчета итераций используется переменная-счетчик, называемая также индексом цикла (loop index). По завершении каждой итерации счетчик увеличивается, начиная с нижнего предела, или уменьшается, начиная с верхнего предела. Как только его значение выйдет за указанный диапазон, цикл завершается. Синтаксис выглядит следующим образом:
FOR счетчик IN [REVERSE] нижняя_граница .. верхняя_граница
LOOP
операторы;
END LOOP;
Печать чисел реализуется циклом FOR в следующем блоке:
BEGIN
FOR just_a_num IN 1..10
LOOP
dbms_output.put_line(just_a_num);
END LOOP;
END;
/
Если использовать в этом цикле FOR команду REVERSE, то числа будут показаны в обратном порядке — от 10 до 1.
6.3. Курсоры
Курсор — это исключительно важная конструкция PL/SQL, лежащая в основе взаимодействия PL/SQL и SQL. Название "курсор" означает "текущий набор записей". Курсор представляет собой специальный элемент PL/SQL, с которым связан SQL-оператор SELECT. Используя курсор, можно отдельно обрабатывать каждую строку связанного с ним SQL-оператора. Курсор объявляется в секции объявлений базового блока. Он открывается командой OPEN, а выборка строк осуществляется с помощью команды FETCH.
После завершения всей обработки курсор закрывается командой CLOSE. Закрытие курсора освобождает те системные ресурсы, которые использовались, пока он был открыт. Строки, выбранные курсором, можно заблокировать, чтобы предотвратить их модификацию другими пользователями. Закрытие курсора или выполнение явной операции COMMIT или ROLLBACK приведет к разблокированию строк.
Для SQL-операторов, используемых в коде PL/SQL, применяются скрытые, или неявные (implicit), курсоры,которые рассмотриваются в следующей теме, а в этом разделе будут использованы явные (explicit) курсоры, т.е. те, которым присвоено имя.
Объявление курсора и атрибуты курсора
Курсор объявляется в процедуре PL/SQL следующим образом:
CURSOR имя_курсора [(параметр_1 [, параметр_2...])]
[RETURN спецификация_возврата]
IS
оператор_select
[FOR UPDATE
[OF таблица_или_столбец_1
[, таблица_или_столбец_2...]
]
]
Параметры курсора похожи на параметры процедуры, за тем исключением, что они всегда являются входными (IN). Использование параметров OUT или IN OUT невозможно, поскольку курсор не может их модифицировать. Параметры используются в конструкции WHERE курсорного оператора SELECT. Спецификация возврата показывает, записи какого типа будут выбираться оператором SELECT. Таблица_или_столбец — это имя столбца, который предстоит обновлять, или имя таблицы, в которой предстоит удалять или обновлять строки. Оно должно входить в число имен таблиц и столбцов, указанных в операторе SELECT курсора, и предназначено для документирования, показывая, какие элементы могут быть потенциально модифицированы кодом, использующим данный курсор. Команда FOR UPDATE блокирует строки, выбранные оператором SELECT при открытии курсора. Строки остаются заблокированными до тех пор, пока не закроется курсор не закроется рассмотренными выше способами.
Курсор имеет ряд индикаторов, показывающих его состояние. Они называются атрибутами курсора и приведены в табл. 6.1.
Таблица 6.1.
Атрибуты курсора
Атрибут |
Описание |
имя_курсора%ISOPEN |
Позволяет проверить, открыт ли курсор. Если курсор имя_курсора уже открыт, возвращается значение TRUE |
имя_курсора%ROWCOUNT |
Количество строк таблицы, возвращенных оператором SELECT курсора |
имя_курсора%FOUND |
Позволяет проверить, была ли успешной последняя попытка получения записи из курсора. Если запись была выбрана, возвращается значение TRUE |
имя_курсора%NOTFOUND |
Противоположен атрибуту FOUND. Если записей больше не найдено, возвращается значение TRUE |