导读:本期聚焦于小伙伴创作的《mysql如何使用存储过程?mysql存储过程创建与调用方法详解》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《mysql如何使用存储过程?mysql存储过程创建与调用方法详解》有用,将其分享出去将是对创作者最好的鼓励。

mysql存储过程是一组为了完成特定功能的sql语句集合,这些语句被预先编译后存储在数据库中,用户可以通过指定存储过程的名字并传入参数来调用执行。它可以将复杂的业务逻辑封装在数据库层,减少应用层和数据库之间的交互次数,提升执行效率。

mysql如何使用存储过程?mysql存储过程创建与调用方法详解

mysql存储过程的基础语法

创建存储过程的基本结构

创建存储过程需要使用CREATE PROCEDURE语句,基础语法如下:

-- 创建存储过程基础语法
CREATE PROCEDURE 存储过程名称([参数模式] 参数名 参数类型)
BEGIN
    -- 存储过程逻辑语句
END;

其中参数模式有三种:

  • IN:输入参数,调用时传入值,存储过程内部可以读取该值,不能修改返回
  • OUT:输出参数,调用时不需要传入值,存储过程内部可以修改该值,调用结束后可以获取到修改后的值
  • INOUT:输入输出参数,调用时传入值,存储过程内部可以修改,调用结束后可以获取到修改后的值

修改语句结束符

因为存储过程内部包含多个sql语句,默认的分号会被mysql识别为语句结束符,导致创建语句提前终止,所以需要临时修改语句结束符,常用的是使用DELIMITER命令:

-- 将语句结束符修改为$$
DELIMITER $$
-- 创建存储过程的语句
CREATE PROCEDURE test_proc()
BEGIN
    SELECT 'hello procedure';
END $$
-- 将语句结束符改回分号
DELIMITER ;

mysql存储过程创建示例

无参数存储过程创建

创建一个查询用户表所有数据的存储过程:

-- 假设存在user表,包含id、name、age字段
DELIMITER $$
CREATE PROCEDURE query_all_user()
BEGIN
    SELECT id, name, age FROM user;
END $$
DELIMITER ;

带IN参数的存储过程创建

创建一个根据年龄查询用户的存储过程,传入年龄参数返回对应年龄的用户列表:

DELIMITER $$
CREATE PROCEDURE query_user_by_age(IN target_age INT)
BEGIN
    SELECT id, name, age FROM user WHERE age = target_age;
END $$
DELIMITER ;

带OUT参数的存储过程创建

创建一个统计用户总数的存储过程,将统计结果通过输出参数返回:

DELIMITER $$
CREATE PROCEDURE count_user_total(OUT total INT)
BEGIN
    SELECT COUNT(*) INTO total FROM user;
END $$
DELIMITER ;

带INOUT参数的存储过程创建

创建一个将传入的数值加10后返回的存储过程:

DELIMITER $$
CREATE PROCEDURE add_ten(INOUT num INT)
BEGIN
    SET num = num + 10;
END $$
DELIMITER ;

mysql存储过程调用方法

调用无参数存储过程

使用CALL语句调用无参数存储过程,不需要加括号也可以加空括号:

-- 两种调用方式都正确
CALL query_all_user;
CALL query_all_user();

调用带IN参数的存储过程

调用时传入对应类型的参数值即可:

-- 查询年龄为20的用户
CALL query_user_by_age(20);

调用带OUT参数的存储过程

需要定义一个变量来接收输出参数的值,mysql中用户变量以@开头:

-- 定义变量接收结果
CALL count_user_total(@user_total);
-- 查看返回的结果
SELECT @user_total;

调用带INOUT参数的存储过程

需要先给变量赋值,再传入变量调用,调用后变量的值会被修改:

-- 定义变量并赋值
SET @my_num = 5;
-- 调用存储过程
CALL add_ten(@my_num);
-- 查看修改后的变量值,结果为15
SELECT @my_num;

存储过程的查看、修改与删除

查看存储过程信息

可以通过SHOW PROCEDURE STATUS查看当前数据库的所有存储过程,也可以查看指定存储过程的创建语句:

-- 查看所有存储过程
SHOW PROCEDURE STATUS;
-- 查看指定存储过程的创建语句
SHOW CREATE PROCEDURE query_user_by_age;

删除存储过程

使用DROP PROCEDURE语句删除存储过程,如果存在才删除可以加IF EXISTS

-- 删除存储过程
DROP PROCEDURE query_all_user;
-- 存在才删除
DROP PROCEDURE IF EXISTS query_user_by_age;

修改存储过程

mysql不支持直接修改存储过程的内部逻辑,如果需要修改存储过程,只能先删除再重新创建。

存储过程中的变量与流程控制

局部变量定义

在存储过程内部可以使用DECLARE定义局部变量,作用域仅在存储过程内部:

DELIMITER $$
CREATE PROCEDURE test_variable()
BEGIN
    -- 定义局部变量
    DECLARE user_count INT DEFAULT 0;
    -- 给变量赋值
    SELECT COUNT(*) INTO user_count FROM user;
    -- 使用变量
    SELECT user_count;
END $$
DELIMITER ;

流程控制语句

存储过程支持IFCASEWHILE等流程控制语句,以下是一个使用IF判断的示例:

DELIMITER $$
CREATE PROCEDURE check_age(IN age INT, OUT result VARCHAR(20))
BEGIN
    IF age < 18 THEN
        SET result = '未成年';
    ELSEIF age >= 18 AND age < 60 THEN
        SET result = '成年';
    ELSE
        SET result = '老年';
    END IF;
END $$
DELIMITER ;

调用该存储过程:

CALL check_age(25, @age_result);
SELECT @age_result; -- 返回成年

存储过程使用注意事项

  • 存储过程内部不能直接使用USE语句切换数据库,需要在创建时指定对应的数据库,或者使用完整的表名(数据库名.表名)
  • 存储过程的参数名不要和表中的字段名重名,否则会出现逻辑错误
  • 存储过程适合处理复杂的批量逻辑,简单的单条sql语句不需要封装成存储过程,反而会增加数据库的负担
  • 不同数据库的存储过程语法存在差异,以上语法仅适用于mysql数据库

mysql存储过程create_procedurecall_statementsql编程修改时间:2026-07-09 03:00:31

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。