首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL存储过程参数详解——IN、OUT、INOUT 参数怎么用?带你用实战敲代码

MySQL存储过程参数详解——IN、OUT、INOUT 参数怎么用?带你用实战敲代码

作者头像
IT咸鱼
发布2025-06-20 09:56:06
发布2025-06-20 09:56:06
14900
代码可运行
举报
运行总次数:0
代码可运行

每天分享技术栈,开发工具等

存储过程小白系列,专注讲一个知识点,配实战示例,通俗易懂,手把手教你写!


为什么存储过程参数那么重要?别再只会写死的过程了!

小伙伴们,有没有遇到过这样的尴尬?

你写了个存储过程,里面写死了某些值,比如欢迎语里写死“张三”, 结果一旦要换“李四”,你就得改过程代码,反复跑修改、部署,好麻烦!

现实生活中,咱们写程序都是要通用的,不能每次改名字都重写代码啊! 这时候,存储过程的参数就派上大用场了——参数就是给存储过程传值的“输入口”,让它“灵活”起来。

环境说明(上篇基础上延续)

  • MySQL 8.0.44
  • 使用 DataGrip 连接数据库,执行所有 SQL
  • 测试库:testdb

1. 先认识参数:IN、OUT、INOUT

参数类型

作用

传递方向

特点说明

IN

输入参数,给存储过程传入值

调用时传入,过程内只读

过程内不能修改传入值(改变不影响调用者)

OUT

输出参数,存储过程把值返回给调用者

过程内写,调用后拿结果

调用时不传值,过程内部给它赋值,调用后取出值

INOUT

输入输出参数,既传入又返回结果

调用时传入,过程内读写

过程内可以读取初始值并修改,调用结束后返回新值


2. 写个最基础的带IN参数的存储过程

需求:

传入一个名字,过程返回一句欢迎语。


SQL代码

代码语言:javascript
代码运行次数:0
运行
复制

DELIMITER//

CREATEPROCEDURE welcome_in(IN user_name VARCHAR())
BEGIN
-- 使用传入的 user_name 拼接欢迎语,输出一条查询结果
SELECT CONCAT('欢迎你,', user_name,',关注 IT咸鱼!')AS welcome_msg;
END;
//

DELIMITER;

注释讲解:

  • IN user_name VARCHAR(50):定义了一个输入参数 user_name,类型是字符串,最长50字符。调用时需要传入值。
  • CONCAT是 MySQL 字符串连接函数,把 '欢迎你,' + user_name + ',关注 IT咸鱼!' 拼成一句话。
  • 这里的输出是通过 SELECT查询结果返回给客户端。

调用示例

代码语言:javascript
代码运行次数:0
运行
复制

CALL welcome_in('小明');

结果应该是:

代码语言:javascript
代码运行次数:0
运行
复制

+---------------------------+
| welcome_msg               |
+---------------------------+
| 欢迎你,小明,关注 IT咸鱼!|
+---------------------------+

图片
图片

3. 带OUT参数的存储过程怎么写?

需求:

创建一个过程,内部写死一条欢迎语,返回给调用者。


SQL代码

代码语言:javascript
代码运行次数:0
运行
复制

DELIMITER//

CREATEPROCEDURE welcome_out(OUT msg VARCHAR())
BEGIN
-- 把固定字符串赋值给 OUT 参数 msg
SET msg ='欢迎关注 IT咸鱼,和咸鱼一起成长!';
END;
//

DELIMITER;

注释讲解:

  • OUT msg VARCHAR(100):定义了一个输出参数 msg,过程内部给它赋值。
  • SET msg = '...'是给参数赋值的标准写法。
  • 注意调用时不传这个参数的值,过程执行完后它会携带值。

调用示例

代码语言:javascript
代码运行次数:0
运行
复制

-- 定义一个变量用来接收输出参数
SET@msg='';

-- 调用存储过程,将输出参数赋值给变量
CALL welcome_out(@msg);

-- 查看变量值
SELECT @msg;

结果:

代码语言:javascript
代码运行次数:0
运行
复制

+----------------------------------------+
| @msg                            |
+----------------------------------------+
| 欢迎关注 IT咸鱼,和咸鱼一起成长!      |
+----------------------------------------+

图片
图片

4. 带INOUT参数的存储过程示例

需求:

给传入的名字加点修饰,比如叫“小明”,过程把名字改成“尊敬的小明”,并返回。


SQL代码

代码语言:javascript
代码运行次数:0
运行
复制

DELIMITER//

CREATEPROCEDURE welcome_inout(INOUT user_name VARCHAR())
BEGIN
-- 修改传入的参数值
SET user_name = CONCAT('尊敬的', user_name);
END;
//

DELIMITER;

注释讲解:

  • INOUT user_name参数既传入,也传出,调用时传入初始值,执行后变量变更。
  • 过程里给参数重新赋值,修改原值。

调用示例

代码语言:javascript
代码运行次数:0
运行
复制

-- 定义变量,给它赋初值
SET@user_name='小明';

-- 调用存储过程,传入变量,过程内修改变量值
CALL welcome_inout(@user_name);

-- 查看变量的新值
SELECT@user_name;

结果:

代码语言:javascript
代码运行次数:0
运行
复制

+------------+
| @user_name      |
+------------+
| 尊敬的小明 |
+------------+

图片
图片

5. 你可能不懂的细节,答疑解惑!

代码语言:javascript
代码运行次数:0
运行
复制
存储过程内部语句多有分号,MySQL客户端默认用分号结束语句,必须改成别的符号(//)让它识别完整过程。

6. 组件之间的关系和执行环境说明

  • 存储过程定义在 MySQL 服务器端,它是数据库里的“程序片段”,存储在数据库的 mysql.proc表中(用户一般不直接操作它)。
  • 调用存储过程是在客户端执行 CALL命令,DataGrip 是客户端,连接到 MySQL 服务器后发命令。
  • 输入参数由客户端传给服务器存储过程,存储过程执行后可返回结果集(SELECT)和/或输出参数。
  • 存储过程本身是“黑盒”,客户端只用 CALL调用,不能直接看代码,除非用 SHOW CREATE PROCEDURE

7. 进阶小练习(完整示例)

现在写一个存储过程,传入用户名和年龄,过程判断年龄是否满18岁,然后:

  • 如果满18,输出“[用户名],你已经成年了,欢迎关注 IT咸鱼!”
  • 否则,输出“[用户名],你未成年,注意保护自己!”

完整SQL

代码语言:javascript
代码运行次数:0
运行
复制

DELIMITER//

CREATEPROCEDURE check_age(
IN user_name VARCHAR(),
IN user_age INT,
OUT message VARCHAR()
)
BEGIN
IF user_age >=THEN
SET message = CONCAT(user_name,',你已经成年了,欢迎关注 IT咸鱼!');
ELSE
SET message = CONCAT(user_name,',你未成年,注意保护自己!');
END IF;
END;
//

DELIMITER;

调用步骤

代码语言:javascript
代码运行次数:0
运行
复制

-- 定义输出变量
SET@msg='';

-- 调用存储过程,传入参数和输出参数
CALL check_age('小红',,@msg);

-- 查看结果
SELECT@msg;

输出:

代码语言:javascript
代码运行次数:0
运行
复制

+------------------------------+
| @msg                         |
+------------------------------+
| 小红,你已经成年了,欢迎关注 IT咸鱼! |
+------------------------------+

再试一个未成年例子

代码语言:javascript
代码运行次数:0
运行
复制

SET@msg='';
CALL check_age('小强',,@msg);
SELECT@msg;

输出:

代码语言:javascript
代码运行次数:0
运行
复制

+----------------------------+
| @msg                       |
+----------------------------+
| 小强,你未成年,注意保护自己! |
+----------------------------+

图片
图片

8. 总结和学习建议

代码语言:javascript
代码运行次数:0
运行
复制
传入过程的值,过程只读,不改变调用者变量

如果你执行过程中有任何不懂,截图发给我,咱们一起来排查。 关注“IT咸鱼”,不要错过后续更硬核的MySQL存储过程系列!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-06-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT咸鱼 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么存储过程参数那么重要?别再只会写死的过程了!
  • 环境说明(上篇基础上延续)
  • 1. 先认识参数:IN、OUT、INOUT
  • 2. 写个最基础的带IN参数的存储过程
    • 需求:
    • SQL代码
    • 注释讲解:
    • 调用示例
  • 3. 带OUT参数的存储过程怎么写?
    • 需求:
    • SQL代码
    • 注释讲解:
    • 调用示例
  • 4. 带INOUT参数的存储过程示例
    • 需求:
    • SQL代码
    • 注释讲解:
    • 调用示例
  • 5. 你可能不懂的细节,答疑解惑!
  • 6. 组件之间的关系和执行环境说明
  • 7. 进阶小练习(完整示例)
    • 完整SQL
    • 调用步骤
    • 再试一个未成年例子
  • 8. 总结和学习建议
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档