展示兩個存儲過程互調:主過程 myProc 調用子過程 myProc1,通過 OUT 參數接收狀態碼並做分支處理。
DELIMITER $$
CREATE PROCEDURE myProc()
MODIFIES SQL DATA
BEGIN
DECLARE l_status VARCHAR(20);
CALL myProc1(l_status);
IF l_status = 'Duplicate Entry' THEN
SELECT CONCAT('Warning: using existing definition for location ') AS warning;
END IF;
END$$
CREATE PROCEDURE myProc1(OUT out_status VARCHAR(30))
BEGIN
SET out_status = 'Duplicate Entry';
END$$
DELIMITER ;
-- 測試調用
CALL myProc();
-- 結果:
-- +--------------------------------------------------+
-- | warning |
-- +--------------------------------------------------+
-- | Warning: using existing definition for location |
-- +--------------------------------------------------+
-- 清理
DROP PROCEDURE myProc;
DROP PROCEDURE myProc1;
DELIMITER $$ 避免分號衝突,定義結束用 $$,最後恢復 ;。OUT out_status VARCHAR(30),調用時傳入變量 CALL myProc1(l_status),返回值自動賦給 l_status。MODIFIES SQL DATA 聲明主過程修改數據,滿足二進制日志要求。out_status 可設為錯誤碼枚舉,主過程據此決定重試、回滾、記錄日誌等邏輯。DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
@sqlstate = RETURNED_SQLSTATE,
@errno = MYSQL_ERRNO,
@text = MESSAGE_TEXT;
SET out_status = CONCAT('ERR:', @errno, ':', @text);
END;
配合 DECLARE ... HANDLER 可在過程內捕獲異常並通過 OUT 參數透傳給調用方。