Spec-Zone .ru
спецификации, руководства, описания, API
|
RESIGNAL [condition_value
] [SETsignal_information_item
[,signal_information_item
] ...]condition_value
: SQLSTATE [VALUE]sqlstate_value
|condition_name
signal_information_item
:condition_information_item_name
=simple_value_specification
condition_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
пункты, оба из которых являются дополнительными. Это приводит к нескольким
возможным применениям:
Эти варианты использования вся причина изменяются на области условия и диагностику:
Область диагностики содержит одну или более областей условия.
Область условия содержит единицы информации условия, такой как SQLSTATE
значение, MYSQL_ERRNO
, или MESSAGE_TEXT
.
Есть стек областей диагностики. Когда обработчик берет на себя управление, он продвигает область диагностики к вершине стека, таким образом во время выполнения обработчика есть две области диагностики:
Первая (текущая) область диагностики, которая запускается как копия последней области диагностики, но будет перезаписана первым оператором в обработчике, который изменяет текущую область диагностики.
Последняя (сложенная) область диагностики, у которой есть области условия, которые были установлены перед обработчиком, взяла на себя управление.
Максимальное количество областей условия в области диагностики определяется значением max_error_count
системная переменная. См. Раздел
13.6.7.7.5, "Диагностика связанные с областью Системные Переменные".
Простое 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
Детали заставляют это выглядеть сложным, но конечный результат довольно полезен: Обработчики могут выполниться, не уничтожая информацию об условии, которое вызвало активацию обработчика.
RESIGNAL
с a SET
пункт предоставляет новую информацию о сигнале, таким образом, средства
оператора "передают ошибку с изменениями":
RESIGNAL SETsignal_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
оператор может изменить любые из единиц информации сигнала, заставляя первую область условия области
диагностики выглядеть очень отличающимся.
RESIGNAL
с условием значение означает "нажатие условие в текущую область диагностики."
Если SET
пункт присутствует, он также изменяет информацию об ошибке.
RESIGNALcondition_value
[SETsignal_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' |+-------+------+----------------------------------+
Все формы 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()
результаты в "обработчике не активная"
ошибка.