СИГНАЛ
Синтаксис
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;
См. также
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/signal/