Mysql 简明教程

MySQL - SIGNAL Statement

在使用 MySQL 存储过程时,管理异常对于防止过程意外终止和提供有意义的错误信息非常重要。这通过使用 MySQL SIGNAL 语句和 DECLARE …​ HANDLER 语句实现。

The MySQL SIGNAL Statement

MySQL SIGNAL 语句用于传递存储过程中的错误信息。它确保适当处理异常,防止突然终止过程。

Exception Handling with DECLARE …​ HANDLER

你可以使用 DECLARE …​ HANDLER 语句有效管理 MySQL 中的异常。它允许你指定如何在存储过程中处理不同类型的异常。通过将此语句与 SIGNAL 结合使用,你可以对错误处理进行精确控制。

Customizing Error Messages

SIGNAL 语句允许使用 SET MESSAGE_TEXT 命令定制错误消息。这对于修改错误消息以向处理程序、应用程序或客户端提供更有意义的反馈很有帮助。

Syntax

以下是 MySQL SIGNAL 语句的语法 −

SIGNAL condition_value [SET signal_information_item]

其中,

  1. @{s0) 表示要返回的错误值,它可以是“sqlstate_value”或“condition_name”。

  2. 通过 signal_information_item ,您可以设置与错误条件相关的其他信息。您可以指定各种信号信息项,如 CLASS_ORIGIN、SUBCLASS_ORIGIN、MESSAGE_TEXT、MYSQL_ERRNO、CONSTRAINT_CATALOG、CONSTRAINT_SCHEMA、CONSTRAINT_NAME、CATALOG_NAME、SCHEMA_NAME、TABLE_NAME、COLUMN_NAME 或 CURSOR_NAME。

Example

在此示例中,我们创建一个接受度数简写并返回其全写的过程。如果我们提供无效的度数,即 B-Tech、M-Tech、BSC 和 MSC 以外的值,则会使用 SIGNAL 语句生成错误信息 −

DELIMITER //
CREATE PROCEDURE example(IN degree VARCHAR(20), OUT full_form Varchar(50))
BEGIN
IF degree='B-Tech' THEN SET full_form = 'Bachelor of Technology';
ELSEIF degree='M-Tech' THEN SET full_form = 'Master of Technology';
ELSEIF degree='BSC' THEN SET full_form = 'Bachelor of Science';
ELSEIF degree='MSC' THEN SET full_form = 'Master of Science';
ELSE
SIGNAL SQLSTATE '01000'
SET MESSAGE_TEXT = 'Choose from the existing values', MYSQL_ERRNO = 12121;
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Given degree is not valid', MYSQL_ERRNO = 1001;
END IF;
END //
DELIMITER ;

可以按如下所示调用上述过程来检索结果:

CALL example('BSC', @fullform);

可以使用以下 SELECT 语句检索变量值:

SELECT @fullform;

以下是所获得的输出 −

如果您向该过程传递无效的值,它将生成如下所示的错误消息 −

CALL example ('BBC', @fullform);

获得的输出如下 −

ERROR 1001 (45000): Given degree is not valid

Example

以下是演示使用 SIGNAL 语句进行异常处理的另一个示例。在此,我们声明一个条件并使用 SIGNAL 根据某些条件触发异常 −

DELIMITER //
CREATE PROCEDURE example (num INT)
BEGIN
DECLARE testCondition CONDITION FOR SQLSTATE '45000';
IF num < 0 THEN
SIGNAL SQLSTATE '01000';
ELSEIF num > 150 THEN
SIGNAL SQLSTATE '45000';
END IF;
END //
DELIMITER ;

您可以通过传递两个值调用上述过程,如下所示 −

CALL example(15);

以下是所获得的输出 −

Query OK, 0 rows affected (0.00 sec)

通过传递第二个值调用过程 −

CALL example(160);

生成的结果如下所示 −

ERROR 1644 (45000): Unhandled user-defined exception condition

Example

您可以使用 SET MESSAGE_TEXT 和 SIGNAL 语句自定义错误消息,如下例所示 −

DELIMITER //
CREATE PROCEDURE example (num INT)
BEGIN
DECLARE testCondition CONDITION FOR SQLSTATE '45000';
IF num < 0 THEN
SIGNAL SQLSTATE '01000';
ELSEIF num > 150 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Number higher than the limit set';
END IF;
END //
DELIMITER ;

我们获得以下输出 −

Query OK, 0 rows affected (0.01 sec)

您可以通过传递两个值调用上述过程,如下所示 −

CALL example(20);

以下是所获得的输出 −

Query OK, 0 rows affected (0.00 sec)

通过传递第二个值调用过程 −

CALL example(160);

您可以在以下输出中观察到,显示的错误消息已根据用户进行自定义 −

ERROR 1644 (45000): Number higher than the limit set