MySQL存储过程入门
引言
在数据库开发中,存储过程是封装复杂业务逻辑、提升执行效率的重要工具。本文将通过基础语法、实战案例和最佳实践,带您快速掌握MySQL存储过程的核心用法。
一、存储过程基础
1.1 定义与优势
存储过程是预编译的SQL语句集合,存储在数据库中,可通过指定名称调用。其核心优势包括:
- 性能提升:预编译减少解析开销,执行效率更高。
- 逻辑封装:将多表操作、事务控制等复杂逻辑封装为单一接口。
- 安全性增强:通过权限控制限制直接表访问,防止SQL注入。
- 网络优化:批量操作减少客户端-服务器交互次数。
1.2 基本语法
创建存储过程
DELIMITER //
CREATE PROCEDURE procedure_name(IN param1 datatype,OUT param2 datatype
)
BEGIN-- SQL逻辑
END //
DELIMITER ;
- 参数模式:
IN
:输入参数(默认)。OUT
:输出参数。INOUT
:输入输出参数。
调用与删除
-- 调用
CALL procedure_name(input_value, @output_var);
-- 删除
DROP PROCEDURE IF EXISTS procedure_name;
二、变量与控制结构
2.1 变量声明
DECLARE var_name datatype DEFAULT default_value; -- 局部变量
SET @user_var = value; -- 用户变量(以@开头)
2.2 控制语句
条件判断
IF condition THEN-- 语句
ELSEIF another_condition THEN-- 语句
ELSE-- 语句
END IF;
循环结构
- WHILE循环:
WHILE condition DO-- 语句 END WHILE;
- REPEAT循环:
REPEAT-- 语句 UNTIL condition END REPEAT;
- LOOP循环(配合
LEAVE
退出):label: LOOP-- 语句IF condition THENLEAVE label;END IF; END LOOP;
三、实战案例
案例1:订单金额拆分
需求:将订单金额拆分为平台抽成和商户结算金额。
DELIMITER //
CREATE PROCEDURE split_order_amount(IN order_id BIGINT,OUT platform_fee DECIMAL(10,2),OUT merchant_fee DECIMAL(10,2)
)
BEGINDECLARE total_amount DECIMAL(10,2);SELECT amount INTO total_amount FROM orders WHERE id = order_id;SET platform_fee = total_amount * 0.03; -- 平台抽成3%SET merchant_fee = total_amount - platform_fee;INSERT INTO split_records(order_id, platform_fee, merchant_fee)VALUES (order_id, platform_fee, merchant_fee);
END //
DELIMITER ;
调用:
CALL split_order_amount(1001, @pf, @mf);
SELECT @pf, @mf; -- 查看结果
案例2:用户标签清洗
需求:清洗用户标签中的非法字符。
DELIMITER //
CREATE PROCEDURE clean_user_tags()
BEGINDECLARE done INT DEFAULT FALSE;DECLARE uid BIGINT;DECLARE cur CURSOR FOR SELECT user_id FROM users WHERE tags IS NOT NULL;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;OPEN cur;read_loop: LOOPFETCH cur INTO uid;IF done THENLEAVE read_loop;END IF;UPDATE users SET tags = REGEXP_REPLACE(tags, '[^a-zA-Z0-9,]', '') WHERE user_id = uid;END LOOP;CLOSE cur;
END //
DELIMITER ;
四、注意事项与最佳实践
-
变量作用域:
- 局部变量需在
BEGIN
块内声明,仅在当前块有效。 - 用户变量以
@
开头,作用域为当前会话。
- 局部变量需在
-
事务处理:
START TRANSACTION; -- 操作1 -- 操作2 COMMIT; -- 或 ROLLBACK;
-
性能优化:
- 避免在循环中执行单条
UPDATE
,改用批量操作。 - 使用
LIMIT
和索引优化游标性能。
- 避免在循环中执行单条
-
调试技巧:
-- 输出中间结果 SELECT var_name; -- 抛出错误 SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Error message';
五、存储过程 vs 函数
特性 | 存储过程 | 函数 |
---|---|---|
返回值 | 可返回多个结果集或无返回值 | 必须返回单一值 |
调用方式 | CALL procedure_name(...) | SELECT function_name(...) |
参数支持 | IN 、OUT 、INOUT | 仅IN |
使用场景 | 复杂业务逻辑、事务控制 | 简单计算、数据转换 |
结语
通过本文,您已掌握MySQL存储过程的基础语法、实战案例及最佳实践。在实际项目中合理使用存储过程,可显著提升数据库操作效率与安全性。建议从简单案例入手,逐步尝试封装更复杂的业务逻辑,发挥存储过程的最大价值。