Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Секция обработки исключений

PL/SQL предоставляет пользователям гибкие и мощные средства генерации, и обработки ошибок (исключений). Каждые блок PL/SQL может иметь собственную секцию обработки исключений, в которой исключения будут перехватываться и обрабатываться. Когда в блоке PL/SQL порождается исключение, его секция выполнения сразу же завершает работу. Управление переходит к секции обработки исключений. Данное исключение в PL/SQL имеет номер ошибки и сообщение об ошибке; у некоторых исключений есть и имена.

Когда возникает (или порождается) исключения, поток выполнения покидает выполняемую секцию и управление передается непосредственно в секцию обработки исключений текущего блока PL/SQL. Если исключения не обработано в секции исключений, то управление передается за пределы блока.

Исключительная ситуация представляет собой поименованное условие возникновения ошибки. В PL/SQL имеется множество заранее определенных исключительных ситуаций, соответствующих чаще всего встречающимся в ORACLE ошибкам. Например:

NO_DATA_FOUND (данные не обнаружены) в случае, если в результирующем множестве оператора SELECT INTO нет строк,

TOO_MANY_ROWS (слишком много строк), когда в результирующем множестве оператора SELECT INTO более одной строки.

DUP_VAL_ON_INDEX (повторяющееся значение в индексе) в случае, если оператор INSERT или UPDATE дублирует ключевое значение, уже находящееся в таблице.

ZERO_DIVIDE (деление на нуль) в случае, если оператор пытается поделить число на нуль.

В PL/SQL включено почти 20 заранее определенных исключительных ситуаций. Когда в программе встречается заранее определенная исключительная ситуация, то управление программой автоматически передается соответствующему обработчику исключительных ситуаций, если таковой имеется.

Исключительные ситуации, определяемые пользователями, можно объявлять в разделе объявлений программы. Однако чтобы затем установить такую исключительную ситуацию, необходимо выполнить ее явную проверку. При желании можно назначить индивидуальный номер ошибки ORACLE исключительной ситуации, определяемой пользователем. При вызове программой указанной ошибки ORACLE автоматически устанавливается исключительная ситуация, определяемая пользователем.

Объявление исключений. О бъявить собственное исключение с типом данных EXCEPTION можно следующим образом:

 

DECLARE

имя_исключения EXCEPTION;

 

Исключение объявляется один раз в пределах блока, но вложенные блоки могут объявить исключение с тем же именем, что и в объемлющем блоке. Если объявлений несколько, то при обработке исключения объявление во внутреннем блоке имеет более высокий приоритет, чем глобальное объявление.

Все объявленные исключения имеют код ошибки 1 и выводят сообщение “User ***fined exception”, если только не применялась директива EXCEPTION_INIT. Посредством команды PRAGMA EXCEPTION_INIT пользователь может сопоставить объявленному исключению номер ошибки:

 

DECLARE

имя_исключения EXCEPTION;

PRAGMA EXCEPTION_INIT (имя_исключения, номер_ошибки);

 

где номер_ошибки – это литеральная величина (переменные здесь не разрешены). Это может быть номер ошибки Oracle (например, -1855) или же номер пользовательского диапазона от –20000 до –20999.

Генерация исключений. Исключение может генерироваться тремя разными способами:

- процессором PL/SQL,

- явной командой RAISE в коде,

- вызовом встроенной функции RAISE_APPLICATION_ERROR.

 

RAISE – явно генерирует исключение.

RAISE имя_исключения;

 

где имя_исключения – имя объявленного пользователем исключения или имя исключения, объявленного в пакете STANDARD.

Если использовать команду RAISE внутри обработчика исключений, то для повторного порождения текущего исключения имя исключения можно не указывать. За пределами секции исключений такой синтаксис некорректен.

Встроенная функция RAISE_APPLICATION_ERROR генерирует вызов исключений:

RAISE_APPLICATION_ERROR (

номер BINARY_INTEGER,

сообщение VARCHAR2,

стек_ошибок BOOLEAN DEFAULT FALSE);

 

номер – это номер ошибки, целое число в диапазоне от -20999 до -20000;

сообщение – это соответствующее сообщение об ошибке;

стек_ошибок - управляет содержимым стека ошибок.

 

Область видимости исключений. Обработчик исключений обрабатывает или пытается обработать только исключения порожденные в выполняемой секции блока PL/SQL. Исключения, генерируемые в объявлении или в секции исключений, автоматически передается внешнему блоку. Можно ограничить область видимости исключения, поместив код PL/SQL в отдельный блок с собственной секцией обработки исключений.

Распространение исключений. Исключения, сгенерированные в блоке PL/SQL, распространяются во внешний блок, если они не обработаны в секции обработки исключений или были в ней повторно сгенерированы.

Когда возникает исключение, PL/SQL ищет в текущем блоке обработчик исключений, обрабатывающий соответствующую ошибку (или инструкцию WHEN OTHERS, которая описана далее). Если совпадение не обнаружено, то PL/SQL передает исключение во внешний блок или вызывающую программу. Распространение продолжится до тех пор, пока исключение не обработано или не передано вне самого внешнего блока обратно в вызывающую программу. В последнем случае исключение остается необрабатываемым и приводит к остановке вызывающей программы.

Если исключение порождается в блоке PL/SQL, оно не приводит к отказу текущей транзакции, даже если сам блок выдавал команду INSERT, UPDATE или DELETE. Для того чтобы очистить транзакцию в случае возникновения исключения, следует явно выдать команду ROLLBACK.

Однако если исключение осталось необработанным (передано за пределы самого внешнего блока), то многие среды выполняют автоматический безусловный откат всех незафиксированных изменений для сеанса.

Обработанное исключение дальше не распространяется. Для того чтобы перехватить исключение, вывести содержательное сообщение об ошибке и передать исключение во внешний блок как ошибку, его необходимо сгенерировать заново. Заново сгенерировать текущее или новое исключение позволяет описанная ранее команда RAISE.

 

Инструкция в обработчике исключений WHEN OTHERS может применяться как ловушка для всех исключений, не обрабатываемых специальными отдельными инструкциями WHEN в секции обработки исключений. Если эта инструкция присутствует, она должна быть последней в секции обработки исключений.

EXCEPTION

WHEN имя_исключительной ситуации №1

THEN последовательность_операторов №1; ….

 

[WHEN OTHERS

THEN последовательность_операторов №n;]

END;

 

SQLCODE. Встроенная функция, которая возвращает код ошибки SQL для текущего исключения. Пользователь может включить эту функцию внутрь инструкции WHEN OTHERS для обработки определенных ошибок по номеру. Директива компилятора EXCEPTION_INIT позволяет обрабатывать ошибки по имени.

SQLERRM. Встроенная функция, которая возвращает сообщение об ошибке SQL для текущего исключения. Пользователь может включить эту функцию внутрь инструкции WHEN OTHERS для обработки определенных ошибок по номеру. Директива компилятора EXCEPTION_INIT позволяет обрабатывать ошибки по имени.

Рассмотрим пример использования функций SQLERRM и SQLCODE:

 

CREATE TABLE err_test

(widget_name VARCHAR2(100)

widget_count NUMBER

CONSTRAINT no_small_numbers CHECK

(widget_count > 1000));

 

BEGIN

INSERT INTO err_test (widget_name, widget_count)

VALUES (‘Athena’, 2);

EXCEPTION

WHEN OTHERS THEN

IF SQLCODE = -2290 AND SQLERRM LIKE ‘%NO_SMALL_NUMBERS%’

THEN

DBMS_OUTPUT.PUT_LINE (‘widget_count is too small’);

ELSE

DBMS_OUTPUT.PUT_LINE (‘Exception not handled,’

||’SQLcode=’ ||SQLCODE);

DBMS_OUTPUT.PUT_LINE (SQLERRM);

END IF;

END;

 

Когда PL/SQL выполняет этот код, выводится строка: widget_count is too small.

 

 

<== предыдущая лекция | следующая лекция ==>
Автономные транзакции | Программные единицы PL/SQL
Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 1264; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.