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 procedureEx ('BBC', @fullform);
ERROR 1001 (45000): Given degree is not valid

示例

以下是另一个示例:

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
广告
© . All rights reserved.