CALL proc()EXECUTE 權限,無需直接表操作權限DELIMITER $$
CREATE PROCEDURE `proc_name` (
IN p_param1 INT, -- 輸入參數
OUT p_param2 VARCHAR(64), -- 輸出參數
INOUT p_param3 INT -- 輸入輸出參數
)
BEGIN
DECLARE v_local_var INT DEFAULT 0; -- 局部變量
-- 流程控制
IF p_param1 > 0 THEN
SET v_local_var = p_param1 * 2;
ELSE
SET v_local_var = 0;
END IF;
-- 賦值輸出參數
SET p_param2 = CONCAT('Result: ', v_local_var);
SET p_param3 = v_local_var;
-- 多語句需 BEGIN ... END 包裹
INSERT INTO log_tbl (msg) VALUES (p_param2);
END$$
DELIMITER ;
-- 1. 用戶變量接收輸出
SET @out1 = '', @out2 = 0;
CALL proc_name(10, @out1, @out2);
SELECT @out1, @out2;
-- 2. 直接在 SELECT 中調用(僅支持 IN 參數)
SELECT func_name(10); -- 函數而非過程
| 模式 | 關鍵字 | 方向 | 調用時需變量 |
|---|---|---|---|
| 輸入 | IN | 應用 → 過程 | 否(可直接傳常量) |
| 輸出 | OUT | 過程 → 應用 | 是(用戶變量 @var) |
| 輸入輸出 | INOUT | 雙向 | 是 |
IF ... THEN ... ELSEIF ... ELSE ... END IF;CASE WHEN ... THEN ... ELSE ... END CASE;WHILE condition DO ... END WHILE;REPEAT ... UNTIL condition END REPEAT;LOOP ... END LOOP; + LEAVE label; / ITERATE label;DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @err = 1; 異常處理INSERT,改用批量構造值列表或 LOAD DATAPREPARE / EXECUTE 動態 SQL,但注意準備語句緩存限制OUT 而非結果集,減少網絡傳輸GET_LOCK() 互斥或拆分粒度sys.schema_unused_indexes 等元數據視圖輔助治理CTE、窗口函數,複雜邏輯可在單 SQL 完成,減少過程依賴存儲過程是邊界清晰、邏輯相對固定、高頻執行場景的利器;業務快速迭代、邏輯極其複雜時,優先考慮應用層實現,數據庫層保持瘦身。