MySQL存储过程实战:从创建到循环控制详解

季宁
季宁
发布时间:2026-10-15| 3人浏览过
原创

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进阶技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。