Программа пытается выполнить недопустимую операцию с
курсором, например, закрыть неоткрытый курсор.
Провалилась попытка конвертирования символьной строки
в число, потому что она не является допустимым числом.
Примечание: В 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, равным