Spec-Zone.ru › MariaDB

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;

См. также

  • Область диагностики
  • SIGNAL
  • HANDLER
  • Хранимые процедуры и представления
  • Коды ошибок MariaDB
Содержимое, воспроизведённое на этом сайте, является собственностью соответствующих владельцев, и это содержание не проверяется предварительно компанией 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/resignal/

Spec-Zone.ru

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