Главная » Статьи » Базы данных » MySQL |
В этой статье мы расскажем вам, как использовать обработчик MySQL для обработки исключений или ошибок, возникающих в хранимых процедурах. При возникновении ошибки внутри хранимой процедуры, важно исправить ее соответствующим образом, например, продолжая или останавливая исполнение операции и выдавая сообщение об ошибке. MySQL предоставляет простой способ определить обработчики, которые обрабатывают ошибки, исходя из общих условий, таких как предупреждения или исключения из условий, например, конкретные коды ошибок. Объявление обработчикаЧтобы объявить обработчик мы используем оператор DECLARE HANDLER:
Если значение условия совпадает со значением condition_value, MySQL выполнит операторstatement и продолжит или завершит текущий блок кода, исходя из значения action. action может принимать следующие значения:
condition_value задает конкретное условие или класс условия, которые активируют обработчик. condition_value может принимать одно из следующих значений:
В качестве statement может использоваться простой оператор или составной оператор, вшитый с помощью ключевых слов BEGIN и END. Примеры обработки ошибок MySQLДавайте рассмотрим несколько примеров объявления обработчиков. Обработчик, приведенный ниже, означает: когда происходит ошибка, устанавливается значение переменной has_error 1 и выполнение продолжается:
Ниже приводится другой обработчик, который означает, что в случае возникновении любой ошибки, производится откат предыдущей операции, выдается сообщение об ошибке и осуществляется выход из текущего блока кода. Если вы объявляете его внутри блока BEGIN END хранимой процедуры, он немедленно завершает хранимую процедуру:
Если строк для вывода больше нет, для вариантов cursor или оператора SELECT INTO, значение переменной no_row_found устанавливается равным 1 и продолжается исполнение:
При возникновении ошибки дублирования ключа, выдается ошибка MySQL 1062. Следующий обработчик выдает сообщение об ошибке и продолжает выполнение:
Пример обработчика MySQL в хранимых процедурахВо-первых, для демонстрации мы создаем новую таблицу с именем article_tags:
В таблице article_tags хранятся связи между статьями и тегами. К каждой статье может относиться несколько тегов и наоборот. Для простоты, мы не будем создавать таблицы articles и tags, а также внешние ключи в таблицеarticle_tags. Во-вторых, мы создаем хранимую процедуру, которая вставляет пару идентификаторов статьи и тега в таблицу article_tags:
В-третьих, для статьи 1 мы добавляем идентификаторы тега 1, 2 и 3, с помощью вызова хранимой процедуры insert_article_tags:
Четвертое. Давайте попробуем вставить дубликат ключа, чтобы увидеть, действительно ли вызывается обработчик:
Мы получили сообщение об ошибке. Однако, поскольку мы объявили тип обработчика CONTINUE, хранимая процедура продолжает исполняться. В результате, мы все равно получили список тегов для статьи: ![]() Если мы в объявлении обработчика изменим команду CONTINUE на EXIT, мы получим только сообщение об ошибке:
Теперь, мы можем попробовать добавить дубликат ключа, чтобы увидеть результат:
![]() Приоритет обработчиков MySQLВ случае если у вас есть несколько обработчиков, которые имеют право обрабатывать ошибку,MySQL для обработки ошибки будет вызывать наиболее подходящий обработчик. Ошибка всегда обозначается одним из кодов ошибки MySQL, так что MySQL в этом плане имеет возможность четко их идентифицировать. Обозначения SQLSTATE для многих кодов ошибок MySQL менее специфичны. SQLEXCPETION илиSQLWARNING представляют собой сокращения класса значений SQLSTATES, поэтому они имеют общий характер. На основании правил приоритета обработчиков обработчик кода ошибки MySQL, обработчикSQLSTATE и обработчик SQLEXCEPTION имеют приоритеты один, два и три соответственно. Предположим, что в хранимой процедуре insert_article_tags_3 мы объявляем три обработчика:
Теперь мы пробуем добавить в таблицу article_tags дубликат ключа через вызов хранимой процедуры:
Как видите, вызывается обработчик кода ошибки MySQL: ![]() Использование проименованных условий ошибкиНачинаем с объявления обработчика ошибки:
Что означает код 1051? Представьте, что у вас есть большая хранимая процедура, по всему коду которой разбросаны некорректные значения. Настоящий кошмар для разработчиков обслуживания. К счастью, MySQL предоставляет нам оператор DECLARE CONDITION, который объявляет проименованное условие ошибки, связанное с условием. Синтаксис оператора DECLARE CONDITION выглядит следующим образом:
condition_value может представлять собой код ошибки MySQL, например 1015, или значениеSQLSTATE. condition_value представляется с помощью condition_name. После объявления вы можете обращаться к condition_name вместо condition_value. Таким образом, мы можем переписать код, приведенный выше, следующим образом:
Этот код, очевидно, более удобен для чтения, нежели предыдущий. Отметим, что объявление условия должно размещаться перед объявлением обработчика или объявлением курсора. | |
Просмотров: 1309 | |
Всего комментариев: 0 | |