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.