- •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. Обработка ошибок
- •Исключения
- •Системные исключения
- •Исключения, определяемые программистом
Записи pl/sql
Запись PL/SQL— это набор данных базовых типов. К ней можно обращаться, как к единому целому. Для доступа к отдельным полям записи применяется нотация имя_записи.имя_поля, которая уже использовалась для столбцов таблицы. Можно объявлять переменные, имеющие тип записи. Записи имеют один из трех типов, перечисленных ниже.
• Основанные на таблице (table-based) Эти записи имеют поля, совпадающие по имени и типу со столбцами таблицы. Если курсор выбирает всю строку — например, оператором SELECT * FROM некоторая_таблица, — то возвращаемые им записи можно непосредственно копировать в переменную, имеющую тип записи, основанной на таблице некоторая_таблица.
• Основанные на курсоре (cursor-based) Поля этих записей совпадают по имени, типу и порядку с заключительным списком столбцов в курсорном операторе SELECT.
• Определенные программистом (programmer-defined) Это записи, тип которых определяет сам программист.
Использование команд open, fetch и close
Команды открытия курсора, выборки из курсора и закрытия курсора имеют следующий синтаксис:
OPEN имя_курсора;
FETCH имя_курсора INTO переменная_или_список_пвременных;
CLOSE имя_курсора;
После открытия курсор содержит набор записей, если в результате успешного выполнения оператора SELECT из базы данных были выбраны заданные строки. Каждая команда FETCH удаляет запись из открытого курсора и перемещает ее содержимое либо в переменную PL/SQL, тип записи которой совпадает с типом записи курсора, либо в группу переменных PL/SQL, где каждая переменная в списке совпадает по типу с соответствующим полем в записи курсора.
Перед тем как пытаться выбрать из курсора очередную запись, следует проверить с помощью атрибутов FOUND и NOTFOUND, есть ли в нем еще записи. Выборки из пустого курсора будут все время давать последнюю запись, не приводя к ошибке. Поэтому очень важно проверять атрибуты FOUND и NOTFOUND при использовании FETCH.
Фактическая обработка записей из курсора обычно выполняется внутри цикла. При написании такого цикла неплохо начать с проверки, была ли найдена запись в курсоре. Если да, можно продолжать необходимую обработку; в противном случае следует выйти из цикла. То же самое можно сделать более коротким путем, использовав курсорный цикл FOR. При этом PL/SQL будет осуществлять открытие, выборку и закрытие без дополнительного программирования.
Курсорный цикл for
Синтаксис курсорного цикла FOR имеет следующий вид:
FOR запись_курсора IN имя_курсора LOOP
операторы ;
END LOOP;
Этот цикл выбирает записи из курсора в переменную типа запись_курсора. Поля записи_курсора можно использовать для доступа к данным из операторов PL/SQL, выполняемых в цикле. Когда все записи выбраны, цикл завершается. Для удобства в курсорном цикле FOR открытие и закрытие курсора производится автоматически.
Попытка выбрать запись из неоткрытого курсора, приводит к сообщению invalid cursor (недействительный курсор). Если не закрывать курсоры, то в конце концов количество открытых курсоров достигнет максимальной величины, допускаемой системой. Неявные курсоры тоже вносят вклад в достижение этого предела.