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

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 ;
流程控制语句
存储过程支持IF、CASE、WHILE等流程控制语句,以下是一个使用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