MySQL - SIGNAL 语句
使用 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 |
---|
理学学士 |
如果向该过程传递无效值,它将生成如下所示的错误消息 −
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