MySQL - SIGNAL 语句

Table of content


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

MySQL SIGNAL 语句

MySQL SIGNAL 语句用于在存储过程中传达错误信息。它确保异常得到正确处理,防止存储过程突然终止。

使用 DECLARE ... HANDLER 进行异常处理

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

自定义错误消息

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

语法

以下是 MySQL SIGNAL 语句的语法:

SIGNAL condition_value [SET signal_information_item]

其中:

  • condition_value 表示要返回的错误值,可以是 “sqlstate_value” 或 “condition_name”。

  • 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。

示例

在这个示例中,我们创建一个过程,该过程接受学位的简写形式并返回其全称。如果我们提供无效的学位(即除 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;

获得的输出如下:

@fullform
Bachelor of Science

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

CALL example ('BBC', @fullform);

获得的输出如下:

ERROR 1001 (45000): Given degree is not valid

示例

以下是另一个演示使用 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

示例

您可以使用 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
广告