Mysql 简明教程
MySQL - RESIGNAL Statement
在使用 MySQL 中的存储过程时,管理在执行过程中可能出现的异常非常重要。否则,这些异常可能会导致过程突然终止。
为了解决此问题,MySQL 提供了一种通过错误处理程序来处理异常的方法。可以使用 DECLARE…HANDLER 语句声明这些处理程序。
The MySQL RESIGNAL Statement
MySQL RESIGNAL 语句用于在存储过程中发生异常时向处理程序、应用程序或客户端提供错误信息。
Syntax
以下是 MySQL RESIGNAL 语句的语法:
RESIGNAL condition_value [SET signal_information_item]
其中,
-
@{s0) 表示要返回的错误值,它可以是“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。
Example
在此示例中,我们创建了一个接受缩写形式的学位并返回其全称的过程。如果我们提供无效学位(即除 BBA、BCA、MD 和 ITI 之外的值),则会使用 RESIGNAL 语句生成错误消息:
DELIMITER //
CREATE PROCEDURE example(IN degree VARCHAR(20), OUT full_form VARCHAR(50))
BEGIN
DECLARE wrong_choice CONDITION FOR SQLSTATE '45000';
DECLARE EXIT HANDLER FOR wrong_choice
RESIGNAL SET MESSAGE_TEXT = 'Given degree is not valid', MYSQL_ERRNO = 1001;
IF degree='BBA' THEN SET full_form = 'Bachelor of Business Administration';
ELSEIF degree='BCA' THEN SET full_form = 'Bachelor of Computer Applications';
ELSEIF degree='MD' THEN SET full_form = 'Doctor of Medicine';
ELSEIF degree='ITI' THEN SET full_form = 'Industrial Training Institute';
ELSE
SIGNAL wrong_choice;
END IF;
END //
DELIMITER ;
可以按如下所示调用上述过程来检索结果:
CALL example('MD', @fullform);
可以使用以下 SELECT 语句检索变量值:
SELECT @fullform;
以下是所获得的输出 −
如果您向过程传递无效值,它将生成如下错误消息:
CALL example ('IIT', @fullform);
获得的输出如下 −
ERROR 1001 (45000): Given degree is not valid
Handling Warnings with RESIGNAL
我们来看另一个没有向 RESIGNAL 语句传递可选属性的示例:
DELIMITER //
CREATE PROCEDURE testexample (num INT)
BEGIN
DECLARE testCondition1 CONDITION FOR SQLSTATE '01000';
DECLARE EXIT HANDLER FOR testCondition1 RESIGNAL;
IF num < 0 THEN
SIGNAL testCondition1;
END IF;
END //
DELIMITER ;
可以通过传递两个值来调用上述过程。但是,任何以“01”开头的 SQLSTATE 值都表示警告,因此查询将以警告执行,如下所示:
CALL testexample(-15);
获得的输出如下 −
Query OK, 0 rows affected, 1 warning (0.00 sec)