Название | Язык PL/SQL |
---|---|
Автор произведения | Иван Сергеевич Задворьев |
Жанр | Базы данных |
Серия | |
Издательство | Базы данных |
Год выпуска | 2017 |
isbn |
SELECT INTO (ORA-01403)
DUP_VAL_ON_INDEX
попытка вставить в столбец с ограничением
на уникальность значение-дубликат (ORA-00001)
TOO_MANY_ROWS
команда SELECT INTO возвращает
более одной строки (ORA-01422)
VALUE_ERROR
арифметическая ошибка, ошибка преобразования
или усечения чисел и строк (ORA-06502)
INVALID_NUMBER
ошибка преобразования строки в число (ORA-01722)
PROGRAM_ERROR
внутренняя ошибка PL/SQL (ORA-06501)
ZERO_DIVIDE
попытка деления на ноль (ORA-01476)
Схема обработки исключений в Java
В языке программирования Java при описании работы с исключениями используется бейсбольная терминология. При возникновении исключения бросается (throws) объект-исключение. Этот объект как бейсбольный мяч пролетает через исходный код, появившись сначала в том методе, где произошло исключение. В одном или нескольких местах кода объект-исключение пытаются (try) поймать (catch) и обработать. Причем исключение можно обработать в одном месте кода полностью, а можно обработать исключение частично, выбросить его из обработчика снова, поймать в другом месте и обрабатывать дальше.
Приведем пример кода на Java с попыткой поймать два исключения – связанные с ошибками арифметических вычислений и нарушением правил работы с массивами (выход индекса массива за границы диапазона):
try{
…
}
catch(ArithmeticException ae){
System.out.println("From Arithm.Exc. catch: "+ae);
}
catch(ArraylndexOutOfBoundsException arre){
System.out.println("From Array.Exc.catch: "+arre);
}
}
Схема обработки исключений в PL/SQL
Работа с исключениями в PL/SQL очень похожа на то, как это делается в Java.
Для обработки исключений предназначен последний раздел блока PL/SQL – раздел обработки исключений. Этот последний раздел блока после ключевого слова EXCEPTION похож на то, что в Java указывается после ключевого слова catch. Перед обсуждением правил обработки исключений приведем небольшой пример с комментариями в коде.
DECLARE
a INTEGER;
BEGIN
a := 1;
a := 2/0; – бросается предопределенное исключение ZERO_DIVIDE
a := 3; – над этой командой пролетает, команда не выполняется
a := 4; – над этой командой тоже пролетает, команда не выполняется
– управление передается в раздел обработки исключений,
– начинаем «примерку» обработчиков
EXCEPTION
– не подходит по имени ловимого исключения к прилетевшему ZERO_DIVIDE
WHEN PROGRAM_ERROR THEN
DBMS_OUTPUT.PUT_LINE('Программная ошибка');
– оба имени ловимых исключений не подходят к прилетевшему ZERO_DIVIDE
WHEN INVALID_NUMBER OR VALUE_ERROR THEN
DBMS_OUTPUT.PUT_LINE('Ошибка работы с числами и строками');
– подходит по имени к ZERO_DIVIDE (поймали), заходим внутрь обработчика
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('Ошибка деления на ноль');
– OTHERS ловит все, что не поймали другие до него,
– но сюда в этом случае «примерка» не дошла, раньше поймали
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('При