MySQL - 条件处理和 OUT 或 INOUT 参数
如果过程中发生异常,并且该过程包含 OUT 或 INOUT 参数,则该过程将立即终止,而不会将 OUT 参数的值传播给调用者。
如果您使用包含 RESIGNAL 语句的 CONTINUE 或 EXIT 处理程序来处理异常,则 RESIGNAL 语句将检索诊断区域堆栈中的信息。如果发生的异常是错误,则 OUT 或 INOUT 参数的值不会传播回去。
示例
以下过程接受学位的缩写形式并返回其完整形式。如果我们传递的值不是 B-Tech、M-Tech、BSC、MSC,则会生成错误消息。
如果您观察到发生异常的情况,则输出值不会传播回调用者。
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 RESIGNAL SQLSTATE '01000' SET MESSAGE_TEXT = 'Choose from the existing values', MYSQL_ERRNO = 12121; RESIGNAL 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 proceduresEx ('BBC', @fullform); ERROR 1001 (45000): 给定学位无效
示例
以下是另一个示例 -
DELIMITER // CREATE PROCEDURE example (num INT) BEGIN DECLARE testCondition CONDITION FOR SQLSTATE '45000'; IF num < 0 THEN RESIGNAL SQLSTATE '01000'; ELSEIF num > 150 THEN RESIGNAL SQLSTATE '45000'; END IF; END // DELIMITER ;
您可以通过传递两个值来调用上述过程,如下所示 -
DELIMITER ; CALL example(15); CALL example(160); ERROR 1644 (45000): Unhandled user-defined exception condition