MySQL - SIGNAL 語句

Table of content


在使用 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
Bachelor of Science

如果您向過程傳遞無效值,它將生成如下所示的錯誤訊息:

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
廣告