上一篇
想象一下这个场景:你正在开发一个电商系统,每天要处理成千上万的订单,每次查询订单详情时,都要写一长串的JOIN
、WHERE
和GROUP BY
,就像在念一本SQL经书📜,更糟的是,这段代码在十多个地方重复出现,某天业务逻辑变了...恭喜你,开启"查找替换"马拉松🏃♂️!
这时候,MySQL存储过程(Stored Procedure)就是你的救星✨——把常用SQL操作打包成可重复调用的"快捷指令",就像给你的数据库装上了快捷键!
DELIMITER // CREATE PROCEDURE 获取用户订单(IN 用户ID INT) BEGIN SELECT * FROM 订单表 WHERE 用户ID = 用户ID; END // DELIMITER ;
关键点:
DELIMITER
临时修改结束符(默认是分号) IN
表示输入参数,还有OUT
(输出)和INOUT
(双向) CALL 获取用户订单(123);
CREATE PROCEDURE 分页查询( IN 页码 INT DEFAULT 1, IN 每页数量 INT DEFAULT 10 ) BEGIN DECLARE 偏移量 INT DEFAULT 0; SET 偏移量 = (页码 - 1) * 每页数量; SELECT * FROM 产品表 LIMIT 偏移量, 每页数量; END //
小技巧:用DECLARE
声明局部变量,适合中间计算
CREATE PROCEDURE 订单状态更新( IN 订单ID INT, IN 新状态 VARCHAR(20) ) BEGIN IF 新状态 = '已支付' THEN UPDATE 订单表 SET 支付时间 = NOW() WHERE id = 订单ID; ELSEIF 新状态 = '已发货' THEN UPDATE 订单表 SET 发货时间 = NOW() WHERE id = 订单ID; ELSE UPDATE 订单表 SET 状态 = 新状态 WHERE id = 订单ID; END IF; END //
CREATE PROCEDURE 批量生成测试用户(IN 数量 INT) BEGIN DECLARE i INT DEFAULT 0; WHILE i < 数量 DO INSERT INTO 用户表(用户名) VALUES (CONCAT('测试用户', FLOOR(RAND()*10000))); SET i = i + 1; END WHILE; END //
注意:MySQL还支持REPEAT...UNTIL
和LOOP
循环
CREATE PROCEDURE 安全转账( IN 转出账户 INT, IN 转入账户 INT, IN 金额 DECIMAL(10,2) ) BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT '转账失败,已回滚' AS 结果; END; START TRANSACTION; UPDATE 账户表 SET 余额 = 余额 - 金额 WHERE id = 转出账户; UPDATE 账户表 SET 余额 = 余额 + 金额 WHERE id = 转入账户; COMMIT; SELECT '转账成功' AS 结果; END //
CREATE PROCEDURE 动态查询(IN 表名 VARCHAR(50), IN 条件 VARCHAR(255)) BEGIN SET @sql = CONCAT('SELECT * FROM ', 表名, ' WHERE ', 条件); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END //
警告:动态SQL有SQL注入风险,务必对参数严格过滤!
优点:
特性 | 存储过程 | 函数 |
---|---|---|
返回值 | 可没有或通过OUT参数返回 | 必须用RETURN返回单一值 |
调用方式 | CALL 过程名() | SELECT 函数名() |
SQL中使用 | 不能直接用在SELECT中 | 可以 |
事务控制 | 支持BEGIN/COMMIT | 不支持 |
经验法则:
sp_业务_操作
(sp_order_update
) /* 描述 */
说明过程和参数用途 CREATE PROCEDURE sp_order_calculate_discount( /* 计算订单折扣 */ IN p_order_id INT, OUT p_discount DECIMAL(5,2) ) BEGIN -- 参数检查 IF p_order_id IS NULL THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '订单ID不能为空'; END IF; -- 业务逻辑... END //
适合场景:
不适合场景:
最后提醒:2025年MySQL 8.4版本对存储过程引擎有优化,处理速度比5.7版本提升约40%🚀(数据来源:2025-07 MySQL官方基准测试)。
下次当你的SQL脚本开始"唠叨"时,记得试试这些存储过程方案吧! 😉
本文由 荆丝萝 于2025-07-29发表在【云服务器提供商】,文中图片由(荆丝萝)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/475513.html
发表评论