Исключительные ситуации описываются в разделе объявлений блока, инициируются в выполняемом разделе, а обрабатываются в разделе исключительных ситуаций. Существуют два вида исключительных ситуаций: определяемые пользователем и стандартные (предопределенные).
Исключительные ситуации, определяемые пользователем
Исключительная ситуация, определяемая пользователем, обозначает такую ошибку, которая описывается программистом, причем совсем не обязательно, чтобы эта ошибка была ошибкой Oracle, — она может быть, например, ошибкой данных. Стандартные же исключительные ситуации соответствуют типичным ошибкам SQL и PL/SQL.
Исключительные ситуации, определяемые пользователем, описываются в разделе объявлений блока PL/SQL. Как и переменные, исключительные ситуации имеют собственный тип (EXCEPTION) и область действия. Например:
e_TooManyStudents — это идентификатор, который виден во всем блоке. Область действия исключительной ситуации определяется так же, как и область действия переменной или курсора, описанного в том же разделе объявлений. О правилах, определяющих область действия и область видимости идентификаторов PL/SQL, рассказывается в главе 3.
Стандартные ситуации
В Oracle существует ряд исключительных ситуаций, которые соответствуют типичным ошибкам Oracle. Как и стандартные типы данных (NUMBER, VARCHAR2 и т.д.), идентификаторы таких исключительных ситуаций описаны в модуле STANDARD (см. главу 3). Эти идентификаторы доступны программе, и их не надо описывать в разделе объявлений, в отличие от исключительных ситуаций, определяемых пользователем. Стандартные исключительные ситуации приведены в таблице 7.2.
Внимание
Можно также связать определяемые пользователем исключительные ситуации с ошибками Oracle (см. ниже раздел "Прагма EXCEPTION_INIT").
Краткое описание некоторых стандартных исключительных ситуаций приводится ниже. Более подробно об этих ошибках рассказывается в руководстве "PL/SQL User's Guide".
INVALID_CURSOR Эта ошибка возникает при выполнении над курсором запрещенной операции — например, при попытке закрыть уже закрытый курсор. Попытка открыть уже открытый курсор вызывает исключительную ситуацию CURSOR_ALREADY_OPEN.
NO_DATA_FOUND Эта исключительная ситуация устанавливается в двух случаях. Первый случай: оператор SELECT...INTO не возвращает ни одной строки. Если этот оператор возвращает более одной строки, генерируется исключительная ситуация TOO_MANY_ROWS. Второй случай:
попытка обращения к элементу индексной таблицы PL/SQL, которому
не присвоено значение. Ниже приводится анонимный блок, в котором устанавливается исключительная ситуация NO_DATA_FOUND:
Дополнительная информация об индексных таблицах PL/SQL содержится в главе 8.
1NVALID_NUMBER Эта исключительная ситуация устанавливается в
SQL-операторах при неудачной попытке преобразования строки симво-
лов в число. В процедурных операторах генерируется другая исключите-
льная ситуация — VALUE_ERROR. Например, в следующем операторе
возникает так как не является числом:
SQL-операторах при неудачной попытке преобразования строки симво-
лов в число. В процедурных операторах генерируется другая исключите-
льная ситуация — VALUE_ERROR. Например, в следующем операторе
возникает так как не является числом:
STORAGE_ERROR и PROGRAM_ERROR Это внутренние исключительные ситуации. Причиной их возникновения является либо нехватка памяти (STORAGE_ERROR), либо внутренняя ошибка PL/SQL (PROGRAM. ERROR). Чаще всего внутренние ошибки вызываются сбоями в работе системы PL/SQL, и о них следует сообщать в службу технической поддержки корпорации Oracle (Oracle Technical Support).
VALUE_ERROR Эта исключительная ситуация устанавливается при появлении арифметической ошибки, ошибки преобразования, усечения или ограничения в процедурном операторе. Если же ошибка возникает в SQL-операторе, то генерируется исключительная ситуация INVALID_ NUMBER. Причиной ошибки VALUE_ERROR может быть операция присваивания, оператор SELECT...INTO, параметры RETURNING INTO оператора SQL или параметры подпрограммы. Все эти ситуации являются результатом присвоения значения переменной PL/SQL. Если возникает проблема с этим присваиванием, устанавливается
~| До Огас1е8 г текстом сообщения об ошибке VALUE_ERROR было "Numeric §J or Value Error" (ошибочное число или значение). Однако в Огас1е8г сообщение об ошибке будет указывать причину ошибки. Приведем примеры:
ROWTYPE_MISMATCH Эта исключительная ситуация устанавливается
при несоответствии типов базовой курсорной переменной и курсорной
переменной PL/SQL. Например, ROWTYPE_MISMATCH возникает при несоответствии фактического и формального типов, которые возвращаются процедурой, использующей в качестве аргумента курсорную переменную. О курсорных переменных подробно рассказывается в главе 6, там же приводится пример этой исключительной ситуации.
< Предыдущая | Следующая > |
---|