上一篇
想象一下,你正在开发一个电商平台🛒,每天要处理成千上万的订单数据,每次查询订单状态、计算用户积分或者更新库存时,都要写一大段重复的SQL代码,不仅容易出错,还影响效率,这时候,存储过程(Stored Procedure)和函数(Function)就派上用场了!
它们就像是数据库里的"小程序",可以封装复杂的SQL逻辑,提高代码复用性,减少网络传输开销,还能增强安全性🔒,我们就来深入探讨MariaDB/MySQL中存储过程和函数的用法!
存储过程是一组预编译的SQL语句,存储在数据库中,可以被多次调用,它支持参数传递、流程控制(如IF
、LOOP
、CASE
等),甚至能返回多个结果集。
DELIMITER // -- 修改分隔符,避免与SQL语句冲突 CREATE PROCEDURE 过程名([IN|OUT|INOUT] 参数名 数据类型, ...) BEGIN -- SQL语句 END // DELIMITER ; -- 恢复默认分隔符
DELIMITER // CREATE PROCEDURE CalculateOrderTotal( IN order_id INT, OUT total DECIMAL(10,2) ) BEGIN SELECT SUM(price * quantity) INTO total FROM order_items WHERE order_id = order_id; END // DELIMITER ; -- 调用存储过程 CALL CalculateOrderTotal(1001, @order_total); SELECT @order_total; -- 查看结果
✔ 减少网络流量(只需传递参数,不用发送完整SQL)
✔ 提高性能(预编译+缓存执行计划)
✔ 增强安全性(限制直接表访问,通过存储过程操作)
特性 | 存储过程 | 函数 |
---|---|---|
返回值 | 可无或多结果集 | 必须返回单个值 |
参数模式 | IN/OUT/INOUT | 仅IN(MariaDB 10.3+支持OUT) |
调用方式 | CALL 过程名() |
SELECT 函数名() |
DELIMITER // CREATE FUNCTION 函数名(参数 数据类型, ...) RETURNS 返回值类型 [DETERMINISTIC|NOT DETERMINISTIC] -- 是否依赖外部数据 BEGIN -- SQL逻辑 RETURN 值; END // DELIMITER ;
DELIMITER // CREATE FUNCTION GenerateNickname(first_name VARCHAR(50)) RETURNS VARCHAR(100) DETERMINISTIC BEGIN RETURN CONCAT(first_name, FLOOR(RAND() * 1000)); END // DELIMITER ; -- 调用函数 SELECT GenerateNickname('Alice'); -- 可能输出 "Alice742"
⚠️ 函数必须是确定性的(相同输入→相同输出),否则可能影响查询优化
⚠️ MySQL 8.0+默认启用binary_log
时,需声明DETERMINISTIC
或NO SQL
等特性
-- IF语句示例 CREATE PROCEDURE CheckInventory(IN product_id INT) BEGIN DECLARE stock INT; SELECT quantity INTO stock FROM products WHERE id = product_id; IF stock > 0 THEN SELECT 'In stock' AS status; ELSE SELECT 'Out of stock' AS status; END IF; END;
CREATE PROCEDURE SafeDelete(IN user_id INT) BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; SELECT 'Error occurred!' AS message; END; START TRANSACTION; DELETE FROM users WHERE id = user_id; COMMIT; END;
CREATE PROCEDURE DynamicQuery(IN table_name VARCHAR(100)) BEGIN SET @sql = CONCAT('SELECT * FROM ', table_name); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END;
sp_
前缀表示存储过程,fn_
表示函数(如sp_CalculateTax
) 存储过程和函数是数据库开发的超级武器💪:
掌握它们,你的数据库代码将变得更模块化、更高效!现在就去试试写你的第一个存储过程吧~ 🎉
(本文基于MariaDB 10.6和MySQL 8.0验证,2025-08更新)
本文由 常鸿畴 于2025-08-06发表在【云服务器提供商】,文中图片由(常鸿畴)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/548848.html
发表评论