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

MySQL 存儲過程入門詳解:語法、參數模式、變量與註釋規範

     編輯:MySQL 綜合教學

MySQL 5.0+ 引入存儲過程,將業務邏輯下沉至數據庫層,可減少網絡交互、提升效能、封裝邏輯並強化安全。本文系統梳理創建語法、三種參數模式(IN/OUT/INOUT)、變量定義與註釋規範,附完整可執行示例。

1. 創建語法與分隔符機制

CREATE PROCEDURE 過程名 ([參數列表])
[特性 ...]
過程體

關鍵點:分隔符重定義

MySQL 預設以分號 ; 為語句結束符,存儲過程體內含多條語句,若不變更分隔符,解析器會在第一個分號處截斷。標準做法:

DELIMITER //      -- 臨時改用 // 為結束符
CREATE PROCEDURE proc1(OUT s INT)
BEGIN
    SELECT COUNT(*) INTO s FROM user;
END
//
DELIMITER ;       -- 恢復預設分隔符

2. 三種參數模式深度解析

模式關鍵字方向特性默認
輸入參數IN調用者 → 過程過程內修改不返回是
輸出參數OUT過程 → 調用者需在過程內賦值,調用時接收否
輸入輸出INOUT雙向調用時傳入,過程可改並返回否

IN 參數示例

CREATE PROCEDURE demo_in(IN p_in INT)
BEGIN
    SELECT p_in;      -- 查看傳入值
    SET p_in = 2;     -- 內部修改
    SELECT p_in;      -- 修改後值(不返回調用者)
END

OUT 參數示例

CREATE PROCEDURE demo_out(OUT p_out INT)
BEGIN
    SELECT p_out;     -- 初始為 NULL
    SET p_out = 2;    -- 必須賦值
    SELECT p_out;     -- 返回 2 給調用者
END

INOUT 參數示例

CREATE PROCEDURE demo_inout(INOUT p_inout INT)
BEGIN
    SELECT p_inout;   -- 顯示傳入值
    SET p_inout = 2;  -- 修改
    SELECT p_inout;   -- 返回新值
END

3. 變量定義與作用域

  • 局部變量:DECLARE var_name TYPE [DEFAULT val]; 僅在 BEGIN...END 塊內有效,塊結束即銷毀。
  • 用戶變量:@var_name 以 @ 開頭,綁定當前會話,跨過程可見,會話結束消失。
  • 會話/全局系統變量:SET SESSION/GLOBAL var=val; 或 SET @@session./@@global.var=val; 影響當前會話或所有會話。

4. 註釋風格規範

  • 單行註釋:-- 註釋內容(雙減號後**必須有空格**)
  • 多行註釋:/* 註釋內容 */
注意:// 非 MySQL 標準單行註釋,僅部分客戶端支援,建議統一用 -- 。

5. 調用與刪除

CALL proc1(@result);      -- 調用 OUT 參數過程
SELECT @result;           -- 查看返回值

DROP PROCEDURE IF EXISTS proc1;  -- 刪除

最佳實踐建議

  1. 業務邏輯優先在應用層實現,存儲過程用於**高頻、高並發、數據密集型**核心邏輯(如庫存扣減、報表聚合)。
  2. 參數明確聲明 IN/OUT/INOUT,避免隱式默認導致誤解。
  3. 過程體內避免長事務、複雜遊標循環,防鎖爭用與長時間阻塞。
  4. 命名規範:sp_業務域_動作(如 sp_order_create),便於檢索與治理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved