前言
很多刚接触mysql的同学,听到存储过程第一反应就是复杂、难上手。其实存储过程本质就是一段预编译在数据库里的sql代码片段,可以封装多条sql,支持入参、逻辑判断,重复调用。
适合场景:业务逻辑固定、需要频繁执行的一组sql,比如批量统计、简单的数据校验、多表联动查询。
提示:存储过程有利有弊,业务复杂项目不建议大量使用,会增加数据库维护与迁移成本,简单场景可以体验。
一、前置知识点
delimiter:修改语句结束符。mysql默认以;作为结束标记,写存储过程内部会有很多分号,不修改会提前截断语句。create procedure:创建存储过程关键字- 参数类型:
in:入参,调用时传入,存储过程内部只读(最常用)out:出参,存储过程内部赋值,调用后拿到结果inout:既可以传入,也可以传出修改后的值
call 存储名(参数):调用存储过程drop procedure if exists 存储名:删除存储过程
二、写第一个最简单的存储过程(无参数)
我们先写一个不带任何参数的存储过程,作用:查询用户表前10条数据。
-- 如果存在就删除,避免重复创建报错
drop procedure if exists proc_query_user;
-- 修改结束符为$$
delimiter $$
create procedure proc_query_user()
begin
-- 存储过程内部sql
select id, username, create_time from `user` limit 10;
end $$
-- 改回默认结束符
delimiter ;调用
call proc_query_user();
执行call就会直接执行里面的查询语句。
三、带in输入参数的存储过程
根据传入用户id,查询单条用户信息,最常用的场景。
drop procedure if exists proc_get_user_by_id;
delimiter $$
create procedure proc_get_user_by_id(in p_user_id int)
begin
select * from `user` where id = p_user_id;
end $$
delimiter ;调用:
call proc_get_user_by_id(1);
p_user_id是入参,in表示只能传入,存储过程内不能修改对外的值。
四、带out输出参数,返回计算结果
示例:统计用户表总数量,通过out参数返回总数
drop procedure if exists proc_count_user;
delimiter $$
create procedure proc_count_user(out p_total int)
begin
select count(*) into p_total from `user`;
end $$
delimiter ;调用方式,需要定义变量接收输出值:
call proc_count_user(@total); select @total as user_total;
五、带简单if逻辑的存储过程
存储过程支持基础流程判断,根据传入分数判断等级,演示if语法:
drop procedure if exists proc_check_score;
delimiter $$
create procedure proc_check_score(in p_score int, out p_level varchar(20))
begin
if p_score >= 90 then
set p_level = '优秀';
elseif p_score >=60 then
set p_level = '及格';
else
set p_level = '不及格';
end if;
end $$
delimiter ;调用:
call proc_check_score(85, @res); select @res;
六、查看数据库里的存储过程
-- 查看当前库所有存储过程 show procedure status; -- 查看存储过程创建语句 show create procedure proc_get_user_by_id;
七、存储过程的优缺点
✅ 优点
- sql预编译,多次调用省去重复编译开销
- 多条sql封装在一起,减少应用与数据库之间多次网络交互
- 数据库层统一逻辑,多个应用可共用同一套逻辑
❌ 缺点
- 调试麻烦,mysql没有很好的断点调试工具
- 业务逻辑写在数据库,版本管理、代码迁移不方便
- 大量复杂存储过程会加重数据库服务器压力,不利于读写分离、分库分表扩展
- 不同数据库存储过程语法不兼容,换数据库改造成本高
八、什么时候不建议使用
- 业务频繁变更的逻辑
- 需要复杂事务、大量循环计算
- 项目未来可能迁移到其他数据库
现在大多数互联网项目,业务逻辑会放在后端代码(java/python/php),存储过程仅用于少量运维、统计脚本。
小结
存储过程并不神秘,就是数据库里封装的一段可调用sql程序。
上手记住几个关键点:
- 创建前用
delimiter临时修改结束符 - 参数分清
in/out/inout begin...end包裹内部代码- 使用
call()调用
学会简单存储过程,可以用来写数据统计、一次性批量脚本,但不要过度依赖,优先把业务逻辑放在应用层。
到此这篇关于mysql如何写一个简单的存储过程的文章就介绍到这了,更多相关mysql写存储过程内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论