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

13.6.7.4. RESIGNAL Синтаксис

RESIGNAL [condition_value]    [SET signal_information_item    [, signal_information_item] ...]condition_value:    SQLSTATE [VALUE] sqlstate_value  | condition_namesignal_information_item:    condition_information_item_name = simple_value_specificationcondition_information_item_name:    CLASS_ORIGIN  | SUBCLASS_ORIGIN  | MESSAGE_TEXT  | MYSQL_ERRNO  | CONSTRAINT_CATALOG  | CONSTRAINT_SCHEMA  | CONSTRAINT_NAME  | CATALOG_NAME  | SCHEMA_NAME  | TABLE_NAME  | COLUMN_NAME  | CURSOR_NAMEcondition_name, simple_value_specification:    (see following discussion)

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

RESIGNAL позволяет и обработать ошибку и возвратить информацию об ошибке. Иначе, выполняя SQL-оператор в пределах обработчика, информация, которая вызвала активацию обработчика, уничтожается. RESIGNAL также может сделать некоторые процедуры короче, если данный обработчик может обработать часть ситуации, то передать условие "строка" к другому обработчику.

Никакие специальные полномочия не обязаны выполняться RESIGNAL оператор.

Все формы RESIGNAL потребуйте, чтобы текущий контекст был обработчиком особых ситуаций. Иначе, RESIGNAL недопустимо и a RESIGNAL when handler not active ошибка происходит.

Чтобы получить информацию от области диагностики, используйте GET DIAGNOSTICS оператор (см. Раздел 13.6.7.3,"GET DIAGNOSTICS Синтаксис"). Для получения информации об области диагностики см. Раздел 13.6.7.7, "MySQL Diagnostics Area".

Для condition_value и signal_information_item, определения и правила являются тем же самым для RESIGNAL что касается SIGNAL. Например, condition_value может быть SQLSTATE значение, и значение могут указать на ошибки, предупреждения, или "не найденный." Для дополнительной информации см. Раздел 13.6.7.5,"SIGNAL Синтаксис".

RESIGNAL оператор берет condition_value и SET пункты, оба из которых являются дополнительными. Это приводит к нескольким возможным применениям:

Эти варианты использования вся причина изменяются на области условия и диагностику:

Есть стек областей диагностики. Когда обработчик берет на себя управление, он продвигает область диагностики к вершине стека, таким образом во время выполнения обработчика есть две области диагностики:

Максимальное количество областей условия в области диагностики определяется значением max_error_count системная переменная. См. Раздел 13.6.7.7.5, "Диагностика связанные с областью Системные Переменные".

13.6.7.4.1. RESIGNAL Один

Простое RESIGNAL один означает, "передают ошибку без изменения." Это восстанавливает последнюю область диагностики и делает это текущей областью диагностики. Таким образом, это "выталкивает" стек области диагностики.

В пределах обработчика особых ситуаций, который ловит условие, одно использование для RESIGNAL один должен выполнить некоторые другие действия, и затем передать без изменения исходную информацию об условии (информация, которая существовала перед записью в обработчик).

Пример:

DROP TABLE IF EXISTS xx;delimiter //CREATE PROCEDURE p ()BEGIN  DECLARE EXIT HANDLER FOR SQLEXCEPTION  BEGIN    SET @error_count = @error_count + 1;    IF @a = 0 THEN RESIGNAL; END IF;  END;  DROP TABLE xx;END//delimiter ;SET @error_count = 0;SET @a = 0;CALL p();

Предположите что DROP TABLE xx сбои оператора. Стек области диагностики похож на это:

DA 1. ERROR 1051 (42S02): Unknown table 'xx'

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

DA 1. ERROR 1051 (42S02): Unknown table 'xx'DA 2. ERROR 1051 (42S02): Unknown table 'xx'

В этой точке содержание первых (текущих) и вторых (сложенных) областей диагностики является тем же самым. Первая область диагностики может быть изменена операторами, выполняющимися впоследствии в пределах обработчика.

Обычно оператор процедуры очищает первую область диагностики. BEGIN исключение, оно не очищает, оно ничего не делает. SET не исключение, оно очищает, выполняет работу, и приводит к результату "успеха". Стек области диагностики теперь похож на это:

DA 1. ERROR 0000 (00000): Successful operationDA 2. ERROR 1051 (42S02): Unknown table 'xx'

В этой точке, если @a = 0, RESIGNAL выталкивает стек области диагностики, который теперь похож на это:

DA 1. ERROR 1051 (42S02): Unknown table 'xx'

И именно это видит вызывающая сторона.

Если @a не 0, обработчик просто заканчивается, что означает, что нет больше использования для текущей области диагностики (это было "обработано"), таким образом, это может быть выброшено, заставляя сложенную область диагностики стать текущей областью диагностики снова. Стек области диагностики похож на это:

DA 1. ERROR 0000 (00000): Successful operation

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

13.6.7.4.2. RESIGNAL с Новой информацией о Сигнале

RESIGNAL с a SET пункт предоставляет новую информацию о сигнале, таким образом, средства оператора "передают ошибку с изменениями":

RESIGNAL SET signal_information_item [, signal_information_item] ...;

Как с RESIGNAL один, идея состоит в том, чтобы вытолкать стек области диагностики так, чтобы исходная информация вышла. В отличие от этого RESIGNAL один, что-либо определенное в SET изменения пункта.

Пример:

DROP TABLE IF EXISTS xx;delimiter //CREATE PROCEDURE p ()BEGIN  DECLARE EXIT HANDLER FOR SQLEXCEPTION  BEGIN    SET @error_count = @error_count + 1;    IF @a = 0 THEN RESIGNAL SET MYSQL_ERRNO = 5; END IF;  END;  DROP TABLE xx;END//delimiter ;SET @error_count = 0;SET @a = 0;CALL p();

Помните из предыдущего обсуждения это RESIGNAL один результаты в области диагностики складывают как это:

DA 1. ERROR 1051 (42S02): Unknown table 'xx'

RESIGNAL SET MYSQL_ERRNO = 5 оператор приводит к этому стеку вместо этого, который является тем, что видит вызывающая сторона:

DA 1. ERROR 5 (42S02): Unknown table 'xx'

Другими словами это изменяет код ошибки, и ничто иное.

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

13.6.7.4.3. RESIGNAL со Значением Условия andOptional Новая информация о Сигнале

RESIGNAL с условием значение означает "нажатие условие в текущую область диагностики." Если SET пункт присутствует, он также изменяет информацию об ошибке.

RESIGNAL condition_value    [SET signal_information_item [, signal_information_item] ...];

Эта форма RESIGNAL восстанавливает последнюю область диагностики и делает это текущей областью диагностики. Таким образом, это "выталкивает" стек области диагностики, который является тем же самым как какой простое RESIGNAL один сделал бы. Однако, это также изменяет область диагностики в зависимости от значения условия или информации о сигнале.

Пример:

DROP TABLE IF EXISTS xx;delimiter //CREATE PROCEDURE p ()BEGIN  DECLARE EXIT HANDLER FOR SQLEXCEPTION  BEGIN    SET @error_count = @error_count + 1;    IF @a = 0 THEN RESIGNAL SQLSTATE '45000' SET MYSQL_ERRNO=5; END IF;  END;  DROP TABLE xx;END//delimiter ;SET @error_count = 0;SET @a = 0;SET @@max_error_count = 2;CALL p();SHOW ERRORS;

Это подобно предыдущему примеру, и эффекты являются тем же самым, за исключением того, что если RESIGNAL происходит, область текущего положения выглядит по-другому в конце. (Причина условие добавляет к, а не заменяет существующее условие, использование значения условия.)

RESIGNAL оператор включает значение условия (SQLSTATE '45000'), таким образом, это добавляет новую область условия, приводящую к стеку области диагностики, который похож на это:

DA 1. (condition 2) ERROR 1051 (42S02): Unknown table 'xx'      (condition 1) ERROR 5 (45000) Unknown table 'xx'

Результат CALL p() и SHOW ERRORS поскольку этот пример:

mysql> CALL p();ERROR 5 (45000): Unknown table 'xx'mysql> SHOW ERRORS;+-------+------+----------------------------------+| Level | Code | Message                          |+-------+------+----------------------------------+| Error | 1051 | Unknown table 'xx'               || Error |    5 | Unknown table 'xx'               |+-------+------+----------------------------------+

13.6.7.4.4. RESIGNAL Требует Условия HandlerContext

Все формы RESIGNAL потребуйте, чтобы текущий контекст был обработчиком особых ситуаций. Иначе, RESIGNAL недопустимо и a RESIGNAL when handler not active ошибка происходит. Например:

mysql> CREATE PROCEDURE p ()
            RESIGNAL;Query OK, 0 rows affected (0.00 sec)mysql> CALL
            p();ERROR 1645 (0K000): RESIGNAL when handler not active

Вот более трудный пример:

delimiter //CREATE FUNCTION f () RETURNS INTBEGIN  RESIGNAL;  RETURN 5;END//CREATE PROCEDURE p ()BEGIN  DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @a=f();  SIGNAL SQLSTATE '55555';END//delimiter ;CALL p();

RESIGNAL происходит в пределах сохраненной функции f(). Хотя f() непосредственно вызывается в пределах контекста EXIT обработчик, выполнение в пределах f() имеет его собственный контекст, который не является контекстом обработчика. Таким образом, RESIGNAL в пределах f() результаты в "обработчике не активная" ошибка.