在 MySQL 預存程序中,若需根據業務邏輯主動拋出錯誤以中斷執行或通知呼叫端,可使用 SIGNAL 關鍵字(MySQL 5.5+)或自訂錯誤處理函式。
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 CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
SET @err = 1; -- 標記發生錯誤
END;
SIGNAL / RESIGNAL