MySQL存储过程实战:从创建到循环控制详解
MySQL存储过程是一组预编译的SQL语句集合,用于在数据库端执行复杂业务逻辑。本文详细介绍了存储过程的CRUD操作、参数传递机制(IN/OUT)、变量管理以及IF条件、CASE分支和三种循环结构的实际用法,旨在提供一套可立即参考的数据库编程指南。
存储过程基础与生命周期管理
存储过程是事先经过编译并存储在数据库中的一段SQL语句集合。相比于直接在应用层拼接SQL,使用存储过程可以减少网络传输开销,提高数据处理效率,并将部分业务逻辑下沉至数据库层。
第1步:创建存储过程
目的:将一系列SQL语句打包为一个可复用的单元。
关键入口与动作:由于默认的分号;会被客户端视为语句结束,因此在定义包含多条SQL的过程前,必须修改语句分隔符。
# 自定义分隔符为 //
delimiter //
create procedure 存储过程名称(参数列表)
begin
-- SQL语句
end //
# 还原分隔符为分号
delimiter ;
完成状态:数据库中新增了对应的过程对象,可通过系统表查询确认。
第2步:调用存储过程
动作:使用CALL关键字触发执行。
call proc_stu();
第3步:查看与删除
查看状态:通过以下命令列出当前数据库中的存储过程及其属性。
show procedure status;
删除过程:若需移除存储过程,直接使用DROP语句,建议先检查是否存在以避免报错。
drop procedure if exists proc_stu;
存储过程核心语法:变量与控制流
存储过程支持编程特性,包括变量声明、条件判断和循环结构,这使其能够处理比简单查询更复杂的业务逻辑。
第4步:变量的声明与赋值
目的:在BEGIN...END块内部定义临时变量以暂存数据。
动作细节:
- DECLARE:必须在块的开头声明,语法为
DECLARE 变量名 类型 [DEFAULT 值];。一次可声明多个变量,用逗号分隔。 - SET赋值:用于直接赋予常量或表达式结果,如
SET name = '值';。 - SELECT INTO:从查询结果中取值并存入变量。注意:查询必须且只能返回单行单列,否则报错。
第5步:条件判断逻辑
需求:根据身高判断身材类型(≥180为高挑,170-180为标准,<170为一般)。
实现方案:使用IF...ELSE IF...ELSE结构。
delimiter $
create procedure pro_figure(in height int(11))
begin
declare figure varchar(50) default '';
if height >= 180 then
set figure = '身材高挑';
else if height < 180 and height >= 170 then
set figure = '标准身材';
else
set figure = '一般身材';
end if;
select concat(height, '身高的身材为:', figure);
end $
delimiter ;第6步:传递参数类型
MySQL存储过程支持三种参数模式:
- IN(默认):输入参数,调用时需传值,过程内修改不影响外部变量。
- OUT:输出参数,用于向调用者返回值。需在过程内赋值,调用时使用用户会话变量(
@var_name接收)。 - INOUT:既可输入也可输出。
OUT调用示例:
call pro_output(175, @figure); -- 使用@变量接收输出 select @figure;
第7步:CASE多分支结构
需求:根据月份判断季度。
动作:当涉及多个离散值的匹配时,CASE比多层IF更高效清晰。
delimiter $
create procedure pro_quarter(in mon int)
begin
declare result varchar(10);
case
when mon between 1 and 3 then set result = '第一季度';
when mon between 4 and 6 then set result = '第二季度';
when mon between 7 and 9 then set result = '第三季度';
else set result = '第四季度';
end case;
select result;
end $
delimiter ;第8步:循环控制结构
处理累加或批量处理时常用循环,MySQL提供三种形态:
WHILE循环:先进后出
特点:满足条件时才执行循环体。
while number <= num do
set total = total + number;
set number = number + 1;
end while;REPEAT循环:先做后判
特点:至少执行一次,直到条件满足时退出(注意UNTIL后不加分号)。
repeat
set total = total + num;
set num = num - 1;
until num = 0
end repeat;LOOP与LEAVE配合:手动退出
特点:无内置退出条件,需借助LEAVE label语句跳出。
c_loop: loop
set total = total + num;
set num = num - 1;
if num <= 0 then
leave c_loop; -- 跳转到标签处,相当于跳出循环
end if;
end loop c_loop;以上就是MySQL存储过程及语法的详细内容,更多关于MySQL进阶技巧的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









