ОБРАБОТЧИК DECLARE
Синтаксис
DECLARE handler_type HANDLER
FOR condition_value [, condition_value] ...
statement
handler_type:
CONTINUE
| EXIT
| UNDO
condition_value:
SQLSTATE [VALUE] sqlstate_value
| condition_name
| SQLWARNING
| NOT FOUND
| SQLEXCEPTION
| mariadb_error_code
Описание
Оператор DECLARE ... HANDLER определяет обработчики, каждый из которых может обрабатывать одно или несколько условий. Если происходит одно из этих условий, выполняется указанный оператор. Оператор может быть простым оператором (например, SET var_name = value), или это может быть составной оператор, написанный с использованием BEGIN и END.
Обработчики должны быть объявлены после локальных переменных, CONDITION и курсора.
Для обработчика CONTINUE выполнение текущей программы продолжается после выполнения оператора обработчика. Для обработчика EXIT выполнение завершается для составного оператора BEGIN ... END, в котором объявлен обработчик. (Это верно даже если условие возникает во внутреннем блоке.) Тип обработчика UNDO не поддерживается.
Если возникает условие, для которого не объявлен обработчик, то выполняется действие по умолчанию EXIT.
Значение condition_value для DECLARE ... HANDLER может быть любым из следующих значений:
- Значение SQLSTATE (строковая литерал длиной 5 символов) или код ошибки MariaDB (число). Не следует использовать значение
SQLSTATE'00000' или код ошибки MariaDB 0, поскольку они указывают на успех, а не на условие ошибки. Список значенийSQLSTATEи кодов ошибок MariaDB см. в Кодах ошибок MariaDB. - Имя условия, ранее указанное с помощью
DECLARE ... CONDITION. Оно должно находиться в той же хранимой программе. См. DECLARE CONDITION. -
SQLWARNING— это сокращение для класса значений SQLSTATE, начинающихся с '01'. -
NOT FOUND— это сокращение для класса значенийSQLSTATE, начинающихся с '02'. Это актуально только в контексте курсоров и используется для управления тем, что происходит, когда курсор достигает конца набора данных. Если больше строк недоступно, возникает условие «Нет данных» со значениемSQLSTATE02000. Чтобы обнаружить это условие, можно настроить обработчик для него (или для условияNOT FOUND). Пример показан в Обзоре курсора. Это условие также возникает для операторов SELECT ... INTO var_list, которые не извлекают ни одной строки. - SQLEXCEPTION — это сокращение для класса значений SQLSTATE, которые не начинаются с '00', '01' или '02'.
Когда возникает ошибка, в некоторых случаях она может обрабатываться несколькими HANDLER. Например, может быть обработчик для ошибки 1050, отдельный обработчик для SQLSTATE 42S01 и другой отдельный обработчик для класса SQLEXCEPTION: теоретически все случаи HANDLER могут поймать ошибку 1050, но MariaDB выбирает HANDLER с наивысшим приоритетом. Вот правила приоритета:
- Обработчики, которые ссылаются на код ошибки, имеют наивысший приоритет.
- Обработчики, которые ссылаются на SQLSTATE, следуют далее.
- Обработчики, которые ссылаются на класс ошибки, имеют наименьший приоритет.
В некоторых случаях оператор может вызывать несколько ошибок. Если это происходит, в некоторых случаях несколько обработчиков могут иметь наивысший приоритет. В таких случаях выбор обработчика неопределён.
Обратите внимание, что если ошибка возникает внутри блока CONTINUE HANDLER, её может обработать другой HANDLER. Однако HANDLER, который уже находится в стеке (то есть он был вызван для обработки ошибки и его выполнение ещё не завершено), не может обрабатывать новые ошибки — это предотвращает бесконечные циклы. Например, предположим, что хранимая процедура содержит обработчик CONTINUE HANDLER для SQLWARNING и другой обработчик CONTINUE HANDLER для NOT FOUND. В какой-то момент возникает ошибка NOT FOUND, и выполнение входит в NOT FOUND HANDLER. Но внутри этого обработчика возникает предупреждение, и выполнение входит в SQLWARNING HANDLER. Если возникает другая ошибка NOT FOUND, она не может быть обработана снова NOT FOUND HANDLER, потому что его выполнение не завершено.
Когда блок DECLARE HANDLER может обрабатывать более одного условия ошибки, может быть полезно узнать, какие ошибки произошли. Для этого можно использовать оператор GET DIAGNOSTICS.
Ошибку, обработанную конструкцией DECLARE HANDLER , можно повторно выдать с помощью оператора RESIGNAL.
Ниже приведён пример использования DECLARE HANDLER:
CREATE TABLE test.t (s1 INT, PRIMARY KEY (s1));
DELIMITER //
CREATE PROCEDURE handlerdemo ( )
BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;
SET @x = 1;
INSERT INTO test.t VALUES (1);
SET @x = 2;
INSERT INTO test.t VALUES (1);
SET @x = 3;
END;
//
DELIMITER ;
CALL handlerdemo( );
SELECT @x;
+------+
| @x |
+------+
| 3 |
+------+
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/declare-handler/