從 SQL Server 遷移 MySQL 時,存儲過程三大「不習慣」:
@ → ?-- 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 時區分。
CALL `mydb`.`proc_name`(...); -- 庫名必須小寫(Windows 大小寫不敏感但最佳實踐小寫)
未指定庫時取決於 DATABASE(),易導致「找不到過程」誤判。
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 安全上下文。