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

MySQL 存儲過程完整教程:從入門到控制流、弊端與最佳實踐

     編輯:MySQL 綜合教學

什麼是存儲過程

一組預編譯的 SQL 語句集合,駐留在數據庫服務器端,支持參數輸入/輸出、變量聲明、條件判斷、循環等過程化邏輯,類比 Java 方法。主動調用(CALL),區別於觸發器的被動觸發。

核心特性

  • 參數模式:IN(輸入)、OUT(輸出)、INOUT(雙向)
  • 局部變量:DECLARE var TYPE [DEFAULT val]
  • 控制結構:IF/ELSEIF/ELSE、CASE、WHILE/REPEAT/LOOP、ITERATE/LEAVE
  • 性能優勢:首次調用編譯優化,後續直接執行,減少網絡往返與解析開銷
  • 封裝復用:業務邏輯下沉,多應用共享

快速入門:加法器示例

DELIMITER ;;
CREATE PROCEDURE proc_adder (IN a INT, IN b INT, OUT sum INT)
BEGIN
  DECLARE c INT DEFAULT 0;
  IF a IS NULL THEN SET a = 0; END IF;
  IF b IS NULL THEN SET b = 0; END IF;
  SET sum = a + b;
END;;
DELIMITER ;

-- 調用驗證
SET @b = 5;
CALL proc_adder(2, @b, @s);
SELECT @s AS sum;  -- 7

關鍵點:DELIMITER ;; 臨時修改語句結束符,避免過程體內分號被誤判為結束。

控制流語句實戰

IF / ELSEIF / ELSE

CREATE PROCEDURE proc_if (IN type INT)
BEGIN
  DECLARE c VARCHAR(500);
  IF type = 0 THEN SET c = 'param is 0';
  ELSEIF type = 1 THEN SET c = 'param is 1';
  ELSE SET c = 'param is others';
  END IF;
  SELECT c;
END;

CASE

CREATE PROCEDURE proc_case (IN type INT)
BEGIN
  DECLARE c VARCHAR(500);
  CASE type
    WHEN 0 THEN SET c = 'param is 0';
    WHEN 1 THEN SET c = 'param is 1';
    ELSE SET c = 'param is others';
  END CASE;
  SELECT c;
END;

WHILE 循環

CREATE PROCEDURE proc_while (IN n INT)
BEGIN
  DECLARE i INT DEFAULT 0;
  DECLARE s INT DEFAULT 0;
  WHILE i <= n DO
    SET s = s + i;
    SET i = i + 1;
  END WHILE;
  SELECT s;  -- 返回 0+1+...+n
END;

進階特性

  • 游標:DECLARE cur CURSOR FOR SELECT ... 逐行處理結果集
  • 條件處理:DECLARE CONTINUE/EXIT HANDLER FOR SQLSTATE '23000' ... 捕獲異常
  • 動態 SQL:PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

弊端與使用建議

缺點影響建議
語法差異大遷移極難(MySQL→PostgreSQL/Oracle 需全改寫)核心業務邏輯留在應用層,僅將**高頻、簡單、性能敏感**的邏輯下沉
難以版本控制/代碼評審維護混亂,易成「黑盒」嚴格命名規範、註釋、單獨 SQL 文件管理、納入 CI/CD
調試困難無斷點、變量觀察用 SELECT ... INTO @var 打印中間值,或引入 sys.diagnostics 工具
鎖持有時間長長事務阻塞並發控制過程體執行時間 < 100ms,避免複雜計算

最佳實踐清單

  1. 命名規範:proc__(如 proc_order_create)
  2. 參數必加註釋,OUT 參數初始化
  3. 避免在過程中直接返回結果集(SELECT),改用 OUT 參數或臨時表
  4. 嚴格控制事務邊界:過程內不啟動事務,由調用方控制
  5. 文檔化:輸入/輸出、業務含義、副作用、調用示例

存儲過程是「雙刃劍」:用對是性能利器,用錯是維護噩夢。**克制下沉,精準施策**。

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