Выбрать главу

Программа пытается выполнить недопустимую операцию с

курсором, например, закрыть неоткрытый курсор.

Провалилась попытка конвертирования символьной строки

в число, потому что она не является допустимым числом.

Примечание: В PL/SQL вместо исключения INVALID_NUMBER

создаётся исключение v a l u e _e r r o r .

Была сделана попытка подключиться к базе данных с недопустимым

именем пользователя или паролем.

Оператор s e l e c t i n t o не возвращает строк или была сделана

попытка обращения к удаленному элементу вложенной

таблицы или к непроинициализированному элементу индекса

таблицы.

Попытка обращения к элементу базы данных была сделана

раньше, чем произошло подключение к базе данных.

Внутренняя ошибка PL/SQL.

Переменная курсора для хоста и переменная курсора PL/

SQL, участвующие в присваивании, имеют несовместимые

возвращаемые типы. Например, когда открытая переменная

курсора для хоста передается в хранимую процедуру или

функцию, возвращаемые типы реальных и формальных параметров

должны быть совместимыми.

Была сделана попытка вызвать метод m e m b e r для пустого

объекта. Встроенный параметр s e l f (который всегда является

первым параметром, передаваемым в метод m e m b e r )

оказался пустым.

370 Гпава 11

Таблица 11.1. Предопределенные исключения (окончание)

Исключение Ошибка Описание

STORAGE ERROR 0RA-06500

SUBSCRIPT,

BEYOND COUNT

0RA-06533

SUBSCRIPT, 0RA-06532

OUTSIDE_LIMIT

SYS_INVALID_

ROWID

TIMEOUT_ON_

RESOURCE

ORA-01410

0RA-00051

PL/SQL не хватает памяти или память была повреждена.

Была сделана попытка сослаться на элемент вложенной таблицы

или массива переменной длины, используя номер индекса,

больший нем число элементов в коллекции.

Была сделана попытка сослаться на элемент вложенной таблицы

или массива переменной длины, используя номер индекса

(например, -1), выходящий за границы разрешенного

диапазона.

Конвертирование символьной строки в универсальный

идентификатор строки завершилось аварийно, поскольку

конвертируемая строка не представляет допустимого идентификатора

строки (rowid).

Во время ожидания базой данных ресурса возник таймаут.

Оператор SELECT INTO возвратил более одной строки.

Произошла арифметическая ошибка или ошибка конвертирования,

усечения или ограничения размера. Например, при

выборке значения столбца в символьную переменную, если

значение длиннее, чем объявленный размер переменной,

PL/SQL прерывает присваивание и создаёт исключение

VALUE_ERROR. Примечание: в выражениях PL/SQL исключение

VALUE_ERROR создаётся, если конвертирование символьной

строки в число заканчивается аварийно. В SQL выражениях

создаётся INVALID_NUMBER вместо VALUE,

ERROR.

z e ro _ d iv id e o r a - o i476 Была сделана попытка деления числа на 0.

В следующих разделах показаны примеры некоторых исключений

в таблице 1 1 .1 .

TOO_MANY_ROWS 0RA-014222

VALUE ERROR 0RA-06502

Исключение ZERO_DIVIDE

Исключение ZERO_DIVIDE создаётся при попытке деления числа на 0:

□ BEGIN

DBMS_OUTPUT.PUT_LINE(1 / 0);

EXCEPTION

WHEN ZERO_DIVIDE THEN

DBMS_OUTPUT.PUT_LINE(‘ D iv is io n by zero’ );

END;

/

D iv is io n by zero

Когда создаётся исключение, управление программой передается в

блок EXCEPTION, где прозводится проверки фразы WHEN на наличие совпадающих

исключений; затем выполняется код в соответствующем блоке.

В предыдущем примере исключение ZERO_DIVIDE было создано в блоке

Знакомство с программированием на PL/SQL 371

BEGIN, затем управление было передано в блок EXCEPTION, где было найдено

совпадающее исключение в выражении WHEN и произошло исполнение кода

внутри этого выражения.

Если совпадающие исключения не найдены, то исключение передаётся

во внешний блок кода. Например, если опустить блок EXCEPTION в предыдущем

примере, исключение будет передано “наверх” и переслано в

SQI?Plus:

□ BEGIN

DBMS_OUTPUT. PUT_LINE(1 / 0).;

BEGIN

•k

ERROR at line 1:

ORACLE-01476: divisor is equal to zero

0RA-06512: at line 2

Как видно, Oracle выводит ошибку по умолчанию, которая показывает

номера строк, коды ошибок Oracle и простое описание.

Исключение DUP_VAL_ON_INDEX

Исключение DUP_VAL_ON_INDEX создаётся при попытке записать дублирующееся

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

В следующем примере показана попытка вставить в таблицу customers

строку с customer_id, равным 1. При этом создаётся исключение DUP_VAL

0N INDEX, поскольку в таблице customers уже есть строка с customer_id, равным