Spec-Zone.ru › MariaDB

ОБРАБОТЧИК 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'. Это актуально только в контексте курсоров и используется для управления тем, что происходит, когда курсор достигает конца набора данных. Если больше строк недоступно, возникает условие «Нет данных» со значением SQLSTATE 02000. Чтобы обнаружить это условие, можно настроить обработчик для него (или для условия 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 |
+------+
Содержимое, воспроизведённое на этом сайте, является собственностью его соответствующих владельцев, и это содержимое не проверяется заранее компанией MariaDB. Мнения, информация и мнения, выраженные в этом содержимом, не обязательно отражают мнения MariaDB или любой другой стороны.

© 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API