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

MySQL 存儲過程與函數完整指南:創建、參數模式、變量/條件/游標、修改刪除、權限與優缺點

     編輯:MySQL 資料庫相關知識

核心差異

特性存儲過程函數
返回值無(可通過 OUT 參數返回)**必須**有 RETURNS 返回值
參數模式IN / OUT / INOUT僅 IN(隱式)
調用方式CALL proc()SQL 表達式中 func()
事務控制支援不支援

創建語法

-- 存儲過程
CREATE PROCEDURE proc_name ([IN|OUT|INOUT] param type, ...)
[characteristic ...]
BEGIN
    -- SQL 語句
END;

-- 函數
CREATE FUNCTION func_name (param type, ...)
RETURNS type
[characteristic ...]
BEGIN
    RETURN expr;
END;

characteristic 可設:DETERMINISTIC、READS SQL DATA、SQL SECURITY DEFINER|INVOKER、COMMENT 等。

分隔符技巧

DELIMITER $$
CREATE PROCEDURE p() BEGIN ... END $$
DELIMITER ;

變量、條件、游標(過程體內部)

-- 聲明變量
DECLARE v_sal INT DEFAULT 1000;

-- 賦值
SET v_sal = 3500;
SELECT sal INTO v_sal FROM t_emp WHERE empno=7556;

-- 條件處理
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;

-- 游標
DECLARE cur CURSOR FOR SELECT * FROM t_emp;
OPEN cur;
FETCH cur INTO v_id, v_name;
CLOSE cur;

修改與刪除

ALTER PROCEDURE proc_name [characteristic ...];
ALTER FUNCTION func_name [characteristic ...];
DROP PROCEDURE IF EXISTS proc_name;
DROP FUNCTION IF EXISTS func_name;

優缺點總結

  • 優點:標準組件化、減少網絡往返、安全封裝(只授權 EXECUTE)。
  • 缺點:編寫調試復雜、需 CREATE ROUTINE 權限、版本遷移麻煩、業務邏輯下沉資料庫層增加耦合。

最佳實踐建議

  1. 簡單 CRUD 優先用應用層 ORM/參數化 SQL,複雜多步原子操作才考慮存儲過程。
  2. 函數保持純粹(無副作用),便於優化器內聯。
  3. 嚴格控制 SQL SECURITY DEFINER,避免權限提升風險。
  4. 監控 information_schema.ROUTINES 定期清理廢棄對象。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved