首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 存儲過程互調並獲取錯誤碼示例:OUT 參數傳遞狀態

     編輯:MySQL 資料庫相關知識

展示兩個存儲過程互調:主過程 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;

關鍵點解析

  1. DELIMITER $$ 避免分號衝突,定義結束用 $$,最後恢復 ;。
  2. 子過程參數聲明 OUT out_status VARCHAR(30),調用時傳入變量 CALL myProc1(l_status),返回值自動賦給 l_status。
  3. MODIFIES SQL DATA 聲明主過程修改數據,滿足二進制日志要求。
  4. 實際業務中 out_status 可設為錯誤碼枚舉,主過程據此決定重試、回滾、記錄日誌等邏輯。

擴展:捕獲 SQL 異常狀態

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 參數透傳給調用方。

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