在資料庫開發中,將業務邏輯下沉至存儲過程與函數,能有效減少網路往返、封裝複雜 SQL、提升維護性。本文系統梳理 MySQL 存儲程式的創建、參數機制、流程控制、游標操作及管理維護全流程,並附帶實戰優化建議。
存儲過程是預編譯的 SQL 集合,駐留於 Server 端;函數則強調返回值特性,可嵌入 SQL 表達式。兩者共同優勢在於:
CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic...] routine_body
參數模式:IN(輸入)、OUT(輸出)、INOUT(雙向)。每個參數由「模式 名稱 類型」組成,類型支援所有 MySQL 資料型別。
特性子句:
LANGUAGE SQL:聲明主體語言DETERMINISTIC / NOT DETERMINISTIC:結果確定性,影響查詢快取CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA:SQL 存取限制SQL SECURITY DEFINER | INVOKER:執行權限上下文COMMENT 'string':文檔註釋CREATE FUNCTION sp_name ([func_parameter[,...]]) RETURNS type [characteristic...] routine_body
關鍵差異:強制要求 RETURNS type 聲明返回類型;參數列表無 IN/OUT 模式,預設為輸入;函數體內必須包含 RETURN 語句。
變量聲明:DECLARE var_name type [DEFAULT value];
賦值方式:SET var = expr; 或 SELECT col INTO var FROM table WHERE ...;
游標四步法:
DECLARE cur CURSOR FOR select_stmt;(必須在變量聲明之後、處理程式之前)OPEN cur;FETCH cur INTO var_list; 循環讀取CLOSE cur; 釋放資源提示:游標適用於逐行處理邏輯,大批量操作優先考慮集合式 SQL。
| 語句 | 適用場景 | 關鍵語法 |
|---|---|---|
| IF | 多條件分支 | IF ... THEN ... [ELSEIF ...] [ELSE ...] END IF |
| CASE | 值匹配分支 | CASE val WHEN v1 THEN ... [ELSE ...] END CASE |
| LOOP/LEAVE | 無條件循環+標籤跳出 | [label:] LOOP ... END LOOP; LEAVE label; |
| ITERATE | 跳過本次循環 | ITERATE label; |
| REPEAT | 後測試循環 | REPEAT ... UNTIL condition END REPEAT |
| WHILE | 前測試循環 | WHILE condition DO ... END WHILE |
CALL sp_name([params]);SELECT func_name([params]); 或嵌入 SQL 表達式SHOW PROCEDURE/FUNCTION STATUS [LIKE 'pattern'];SHOW CREATE PROCEDURE/FUNCTION sp_name;SELECT * FROM information_schema.ROUTINES;ALTER PROCEDURE/FUNCTION sp_name [characteristic...];DROP PROCEDURE/FUNCTION [IF EXISTS] sp_name;DETERMINISTIC 開啟查詢快取sp_ 前綴標識過程,fn_ 標識函數掌握存儲程式開發,能讓你在資料庫層面構建高效、安全、可維護的業務邏輯閉環,是資深 DBA 與後端工程師的必修技能。