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

MySQL 開發踩坑記:存儲過程參數、調用限制、權限模型三大差異

     編輯:MySQL 資料庫相關知識

從 SQL Server 遷移 MySQL 時,存儲過程三大「不習慣」:

1. 參數符號:@ → ?

-- SQL Server
CREATE PROC p(@id INT) AS SELECT * FROM t WHERE id=@id;

-- MySQL
CREATE PROCEDURE p(IN p_id INT) BEGIN SELECT * FROM t WHERE id=p_id; END;
-- 調用時:CALL p(?);  -- 占位符用 ?,不帶 @

MySQL 用戶變量用 @var,過程參數無符號,體現在 PREPARE ... USING @var 時區分。

2. 調用需帶庫前綴且小寫

CALL `mydb`.`proc_name`(...);  -- 庫名必須小寫(Windows 大小寫不敏感但最佳實踐小寫)

未指定庫時取決於 DATABASE(),易導致「找不到過程」誤判。

3. 無 RETURN,用 OUT/INOUT 輸出

CREATE PROCEDURE calc(IN a INT, IN b INT, OUT sum INT)
BEGIN SET sum = a + b; END;

CALL calc(1,2,@s);
SELECT @s;  -- 3
  • IN:輸入(默認)
  • OUT:輸出,調用前無需初始化
  • INOUT:雙向

函數(CREATE FUNCTION)才有 RETURN,但函數內不可做 DML/事務控制。

其他常見差異

  • DECLARE 只能在 BEGIN ... END 塊開頭,不能夾雜在語句中。
  • IF ... THEN ... ELSE ... END IF; 結尾必須有分號。
  • 游標 DECLARE cur CURSOR FOR SELECT ... 需配合 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;。
  • 權限:GRANT EXECUTE ON PROCEDURE db.proc TO user@host;,MySQL 8.0 支持 DEFINER/INVOKER 安全上下文。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved