Студопедия

КАТЕГОРИИ:


Архитектура-(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)

Обработчик ошибок




 

Во время выполнения хранимых процедур и функций могут происходить самые разнообразные ошибки. При интерактивном выполнении запросов отследить возникновение ошибки и предпринять действия, направленные на их предотвращение, гораздо легче, чем при пакетном выполнении десятков запросов в хранимой процедуре. Поэтому СУБД MySQL поддерживает обработчик ошибок, которые позволяют каждой возникающей в хранимой процедуре ошибке назначить свой собственный обработчик. Кроме того, обработчик в зависимости от ситуации и серьезности ошибки может как прекратить, так и продолжить выполнение процедуры.

 

Для объявления такого обработчика предназначен оператор declare…handler for, который имеет следующий синтаксис:

 

DECLARE handler_type HANDLER FOR condition_value [, …] sp_statement

 

Тип обработчика handler_type может принимать одно из трех значений:

 

§ continue – выполнение текущей операции продолжается после выполнения оператора обработчика;

§ exit – выполнение составного оператора begin…end, в котором объявлен обработчик, прекращается;

§ undo – данный вид обработчика пока не поддерживается.

 

Конструкция condition_value задает код ошибки, для которой будет происходить срабатывание обработчика. Обработчик может быть привязан сразу к нескольким ошибкам, для этого их коды следует перечислить через запятую. Конструкция condition_value может принимать одно из следующих значений:

 

  • sqlstate [value] sqlstate_value – значение sqlstate является пятисимвольным кодом в шестнадцатеричном формате и является стандартом в SQL. В СУБД MySQL данный код поддерживается, начиная с версии 4.1. Примерами таких кодов являются ‘HY000’, ‘42000’ и т. п. Следует отметить, что один код обозначает сразу несколько ошибок MySQL;
  • sqlwarning – любое предупреждение MySQL. Данное ключевое слово позволяет назначить обработчик для всех предупреждений MySQL. В терминах sqlstate обрабатываются любые события, для которых код sqlstate начинается с ‘01’;
  • not found – любая ошибка MySQL, связанная с отсутствием или невозможностью найти объект (таблицу, процедуру, функцию, столбец и т. п.). Данное ключевое слово позволяет назначить обработчик для всех ошибок такого рода. В терминах sqlstate обрабатываются любые события, для которых код sqlstate начинается с ‘02’;
  • mysql_error_code – обычные четырехзначные ошибки MySQL, такие как ‘1020’, ‘1232’, ‘1324’ и т. п.;
  • condition_name – имя условия, которое объявляется при помощи оператора declare…condition for, рассмотренного далее.

 

Выражение sp_statement содержит SQL-запрос, который выполняется при срабатывании обработчика.

 

Для демонстрации приемов работы с обработчиками ошибок создадим таблицу tbl (если она не была создана ранее), содержащую единственный столбец id, являющийся первичным ключом.

 

create table tbl (id int, primary key(id));

 

Так как поле id объявлено первичным ключом, его значения обязаны быть уникальными. Добавление в таблицу значений, совпадающих с одним из тех, которые уже существуют в таблице, приведет к возникновению ошибочной ситуации. Создадим хранимую процедуру handler_key(), которая содержит обработчик такой ситуации, и попытаемся добавить в таблицу tbl три одинаковых значения.

 

 

Как видно из вышеприведенного примера, в результате обработки ошибки не происходит остановка работы процедуры и последний запрос select version() успешно выполняется, несмотря на то, что предпринимаются две попытки присвоить первичному ключу неуникальное значение. В результате срабатывания обработчика, пользовательская переменная @error получает значение ‘Ошибка’.

 

В качестве обработчика ошибки можно использовать и составной оператор.

 

 

Как видно из приведенного выше примера, процедура выполняет все запросы, не прерываясь и лишь вызывая операторы из обработчика при возникновении каждой ошибки. Для того чтобы прекратить выполнение функции при возникновении ошибки, необходимо воспользоваться обработчиком declare exit (см. пример ниже).

 

 

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

 

При указании кода ошибки можно использовать не только их целочисленные значения, но и именованные условия, которые объявляются при помощи оператора declare…condition for, имеющего следующий синтаксис:

 

DECLARE condition_name CONDITION FOR condition_value

 

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

 

  • sqlstate [value] sqlstate_value – значение sqlstate является пятисимвольным кодом в шестнадцатеричном формате и является стандартом в SQL. В СУБД MySQL данный код поддерживается, начиная с версии 4.1. Примерами таких кодов являются ‘HY000’, ‘HY001’, ‘42000’ и т. п. Следует отметить, что один код обозначает сразу несколько ошибок MySQL;
  • mysql_error_code – обычные четырехзначные ошибки MySQL, такие как ‘1020’, ‘1232’, ‘1324’ и т. п.;

 

Например, для обрабатываемой ранее ошибки 1062 (23000) – дублирование уникального индекса, оператор declare…condition for может выглядеть так, как это представлено ниже.

 

declare `violation` condition for sqlstate ‘23000’;

declare `violation` condition for 1062;

 

Первое объявление является более широким и охватывает все ошибки со статусом ‘23000’, второй вид ошибок более узкий и включает только дублирование уникального индекса.

 

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

 

 

В данном примере хранимая процедура выполняет транзакцию. При возникновении ошибки дублирования записей состояние базы данных отказывается при помощи оператора rollback.

 

 




Поделиться с друзьями:


Дата добавления: 2015-05-09; Просмотров: 706; Нарушение авторских прав?; Мы поможем в написании вашей работы!


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



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




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