Spec-Zone.ru › MariaDB

СИГНАЛ

Синтаксис

SIGNAL 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.

error_condition может быть значением SQLSTATE или именем условия ошибки, определённым с помощью DECLARE CONDITION. SQLSTATE должен быть строковым константой, состоящей из пяти символов. Эти коды стандартны для ODBC и ANSI SQL. Для настраиваемых ошибок рекомендуется использовать SQLSTATE '45000'. Список значений SQLSTATE, используемых MariaDB, см. на странице Коды ошибок MariaDB. SQLSTATE можно прочитать с помощью метода API mysql_sqlstate( ).

Для указания свойств ошибки можно использовать пользовательские переменные и локальные переменные, а также преобразования наборов символов конвертации наборов символов (но не коллаций).

Подробное описание свойств ошибки, их типов и значений по умолчанию можно найти на странице области диагностики.

Ошибки

Если SQLSTATE недействителен, будет выдана следующая ошибка:

ERROR 1407 (42000): Bad SQLSTATE: '123456'

Если свойство указано более одного раза, будет выдана ошибка:

ERROR 1641 (42000): Duplicate condition information item 'MESSAGE_TEXT'

Если указано имя условия, которое не объявлено, будет выдана ошибка:

ERROR 1319 (42000): Undefined CONDITION: cond_name

Если MYSQL_ERRNO находится вне допустимого диапазона, будет выдана ошибка:

ERROR 1231 (42000): Variable 'MYSQL_ERRNO' can't be set to the value of '0'

Примеры

Вот что произойдёт, если СИГНАЛ используется в клиенте для генерации ошибок:

SIGNAL SQLSTATE '01000';
Query OK, 0 rows affected, 1 warning (0.00 sec)

SHOW WARNINGS;

+---------+------+------------------------------------------+
| Level   | Code | Message                                  |
+---------+------+------------------------------------------+
| Warning | 1642 | Unhandled user-defined warning condition |
+---------+------+------------------------------------------+
1 row in set (0.06 sec)

SIGNAL SQLSTATE '02000';
ERROR 1643 (02000): Unhandled user-defined not found condition

Как указать свойства MYSQL_ERRNO и MESSAGE_TEXT:

SIGNAL SQLSTATE '45000' SET MYSQL_ERRNO=30001, MESSAGE_TEXT='H
ello, world!';

ERROR 30001 (45000): Hello, world!

Следующий код демонстрирует использование пользовательских переменных, локальных переменных и преобразования наборов символов с СИГНАЛОМ:

CREATE PROCEDURE test_error(x INT)
BEGIN
   DECLARE errno SMALLINT UNSIGNED DEFAULT 31001;
   SET @errmsg = 'Hello, world!';
   IF x = 1 THEN
      SIGNAL SQLSTATE '45000' SET
      MYSQL_ERRNO = errno,
      MESSAGE_TEXT = @errmsg;
   ELSE
      SIGNAL SQLSTATE '45000' SET
      MYSQL_ERRNO = errno,
      MESSAGE_TEXT = _utf8'Hello, world!';
   END IF;
END;

Как использовать именованные условия ошибок:

CREATE PROCEDURE test_error(n INT)
BEGIN
   DECLARE `too_big` CONDITION FOR SQLSTATE '45000';
   IF n > 10 THEN
      SIGNAL `too_big`;
   END IF;
END;

В этом примере мы определим обработчик для кода ошибки. Когда ошибка возникает, мы СИГНАЛИЗИРУЕМ более информативную ошибку, которая имеет смысл для нашей процедуры:

CREATE PROCEDURE test_error()
BEGIN
   DECLARE EXIT HANDLER
   FOR 1146
   BEGIN
      SIGNAL SQLSTATE '45000' SET
      MESSAGE_TEXT = 'Temporary tables not found; did you call init() procedure?';
   END;
   -- this will produce a 1146 error
   SELECT `c` FROM `temptab`;
END;

См. также

  • Область диагностики
  • RESIGNAL
  • DECLARE 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/signal/

Spec-Zone.ru

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