首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 預存程序中拋出自訂錯誤的方法:SIGNAL 與自訂函式

     編輯:MySQL 綜合教學

MySQL 預存程序中拋出自訂錯誤的方法:SIGNAL 與自訂函式

在 MySQL 預存程序中,若需根據業務邏輯主動拋出錯誤以中斷執行或通知呼叫端,可使用 SIGNAL 關鍵字(MySQL 5.5+)或自訂錯誤處理函式。

核心方法:使用 SIGNAL

SIGNAL 可手動觸發例外狀況,指定 SQLSTATE、錯誤代碼與訊息:

-- 直接拋出錯誤
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '自訂錯誤訊息', MYSQL_ERRNO = 1356;

封裝為可重用的預存程序

CREATE PROCEDURE `raise_error`(errno BIGINT UNSIGNED, msg VARCHAR(256))
BEGIN
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg, MYSQL_ERRNO = err_no;
END;

呼叫範例

CALL raise_error(1356, '業務規則違反:庫存不足');

實務應用場景

CREATE PROCEDURE jobq.exec(jobID VARCHAR(128), cmd TEXT)
BEGIN
    DECLARE result INT DEFAULT 0;
    SELECT sys_exec(CONCAT('echo ', cmd, ' | base64 -d > /tmp/jobq.', jobID, '.sh ; bash /tmp/jobq.', jobID, '.sh &>/tmp/jobq.', jobID))
    INTO result;

    IF result > 0 THEN
        CALL raise_error(result, '外部指令執行失敗');
    END IF;
END;

錯誤處理配合:DECLARE HANDLER

捕捉例外並轉為狀態碼:

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
    SET @err = 1;  -- 標記發生錯誤
END;

版本注意事項

  • MySQL 5.5+ 完整支援 SIGNAL / RESIGNAL
  • 5.5 之前版本需用變數模擬或觸發器變通
  • SQLSTATE '45000' 代表「未處理的使用者定義例外」
  • 自訂錯誤碼建議 > 10000 避免衝突內建代碼

參考資源

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved