RESIGNAL
Синтаксис
RESIGNAL [error_condition]
[SET error_property
[, error_property] ...]
error_condition:
SQLSTATE [VALUE] 'sqlstate_value'
| condition_name
error_property:
error_property_name = <error_property_value>
error_property_name:
CLASS_ORIGIN
| SUBCLASS_ORIGIN
| MESSAGE_TEXT
| MYSQL_ERRNO
| CONSTRAINT_CATALOG
| CONSTRAINT_SCHEMA
| CONSTRAINT_NAME
| CATALOG_NAME
| SCHEMA_NAME
| TABLE_NAME
| COLUMN_NAME
| CURSOR_NAME
Описание
Синтаксис RESIGNAL и его семантика очень похожи на SIGNAL. Это утверждение может использоваться только внутри обработчика ошибок HANDLER. Оно генерирует ошибку, как и SIGNAL. RESIGNAL пункты такие же, как у SIGNAL, за исключением того, что все они являются необязательными, даже SQLSTATE. Все свойства, которые не указаны в RESIGNAL, будут идентичны свойствам ошибки, полученной обработчиком ошибок HANDLER. Для описания пунктов см. область диагностики.
Обратите внимание, что RESIGNAL не очищает область диагностики: она просто добавляет ещё одно условие ошибки.
RESIGNAL, без каких-либо пунктов, генерирует ошибку, идентичную ошибке, полученной обработчиком HANDLER.
Если используется вне конструкции HANDLER, RESIGNAL генерирует следующую ошибку:
ERROR 1645 (0K000): RESIGNAL when handler not active
В MariaDB 5.5, если обработчик HANDLER содержал вызов CALL другой процедуре, эта процедура могла использовать RESIGNAL. Начиная с MariaDB 10.0, попытка сделать это вызывает вышеописанную ошибку.
Список значений SQLSTATE и кодов ошибок MariaDB см. в Кодах ошибок MariaDB.
Следующая процедура пытается запросить две несуществующие таблицы, в обоих случаях генерируя ошибку 1146. Эти ошибки активируют обработчик HANDLER. В первый раз ошибка будет проигнорирована, и клиент её не получит, но во второй раз ошибка перевызывается, и клиент её получит.
CREATE PROCEDURE test_error( )
BEGIN
DECLARE CONTINUE HANDLER
FOR 1146
BEGIN
IF @hide_errors IS FALSE THEN
RESIGNAL;
END IF;
END;
SET @hide_errors = TRUE;
SELECT 'Next error will be ignored' AS msg;
SELECT `c` FROM `temptab_one`;
SELECT 'Next error won''t be ignored' AS msg;
SET @hide_errors = FALSE;
SELECT `c` FROM `temptab_two`;
END;
CALL test_error( );
+----------------------------+
| msg |
+----------------------------+
| Next error will be ignored |
+----------------------------+
+-----------------------------+
| msg |
+-----------------------------+
| Next error won't be ignored |
+-----------------------------+
ERROR 1146 (42S02): Table 'test.temptab_two' doesn't exist
Следующая процедура перевызывает ошибку, изменяя только сообщение об ошибке, чтобы пояснить причину проблемы.
CREATE PROCEDURE test_error()
BEGIN
DECLARE CONTINUE HANDLER
FOR 1146
BEGIN
RESIGNAL SET
MESSAGE_TEXT = '`temptab` does not exist';
END;
SELECT `c` FROM `temptab`;
END;
CALL test_error( );
ERROR 1146 (42S02): `temptab` does not exist
Как описано выше, это работает в MariaDB 5.5, но начиная с версии 10.0 генерирует ошибку 1645.
CREATE PROCEDURE handle_error() BEGIN RESIGNAL; END; CREATE PROCEDURE p() BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION CALL p(); SIGNAL SQLSTATE '45000'; END;
См. также
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/resignal/