Spec-Zone .ru
спецификации, руководства, описания, API

13.6.7.2. DECLARE ...HANDLER Синтаксис

DECLARE handler_action HANDLER    FOR condition_value [, condition_value] ...    statementhandler_action:    CONTINUE  | EXIT  | UNDOcondition_value:    mysql_error_code  | SQLSTATE [VALUE] sqlstate_value  | condition_name  | SQLWARNING  | NOT FOUND  | SQLEXCEPTION

DECLARE ... HANDLER оператор определяет обработчик, который имеет дело с одним или более условиями. Если одно из этих условий происходит, указанное statement выполняется. statement может быть простой оператор такой как SET var_name = value, или составной оператор, записанный, используя BEGIN и END (см. Раздел 13.6.1,"BEGIN ... END Синтаксис составного оператора").

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

handler_action значение указывает на то, какое меры обработчик предпринимает после выполнения оператора обработчика:

condition_value для DECLARE ... HANDLER указывает на особое условие или class условий, который активирует обработчик:

Для получения информации о том, как сервер выбирает обработчики, когда условие происходит, см. Раздел 13.6.7.6, "Правила контекста для Обработчиков".

Если условие происходит, для которого не был объявлен никакой обработчик, предпринятые меры зависят от условия class:

Следующий пример использует обработчик для SQLSTATE '23000', который происходит для двойной ключевой ошибки:

mysql> CREATE TABLE test.t (s1 INT, PRIMARY KEY
        (s1));Query OK, 0 rows affected (0.00 sec)mysql> delimiter
        //mysql> 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;    -> //Query OK, 0 rows affected (0.00 sec)mysql> CALL
        handlerdemo()//Query OK, 0 rows affected (0.00 sec)mysql> SELECT
        @x//    +------+    | @x   |    +------+    | 3    |    +------+    1 row in set (0.00 sec)

Заметьте это @x 3 после того, как процедура выполняется, который показывает, что выполнение, продолжаемое до конца процедуры после ошибки, произошло. Если DECLARE ... HANDLER оператор не присутствовал, MySQL предпримет меры значения по умолчанию (EXIT) после второго INSERT отказавший из-за PRIMARY KEY ограничение, и SELECT @x возвратился бы 2.

Чтобы проигнорировать условие, объявите a CONTINUE обработчик для этого и партнер это с пустым блоком. Например:

DECLARE CONTINUE HANDLER FOR SQLWARNING BEGIN END;

Контекст блочной метки не включает код для обработчиков, объявленных в пределах блока. Поэтому, оператор, связанный с обработчиком, не может использовать ITERATE или LEAVE обратиться к меткам для блоков, которые включают объявление обработчика. Рассмотрите следующий пример, где REPEAT у блока есть метка retry:

CREATE PROCEDURE p ()BEGIN  DECLARE i INT DEFAULT 3;  retry:    REPEAT      BEGIN        DECLARE CONTINUE HANDLER FOR SQLWARNING          BEGIN            ITERATE retry;    # illegal          END;        IF i < 0 THEN          LEAVE retry;        # legal        END IF;        SET i = i - 1;      END;    UNTIL FALSE END REPEAT;END;

retry метка находится в контексте для IF оператор в пределах блока. Это не находится в контексте для CONTINUE обработчик, таким образом, ссылка там недопустима и приводит к ошибке:

ERROR 1308 (42000): LEAVE with no matching label: retry

Чтобы избежать ссылок на внешние метки в обработчиках, используйте одну из этих стратегий: