1. 首页 > MySQL教程 > 正文

MySQL教程FG122-MySQL存储过程参数与返回值

内容简介:本文主要介绍MySQL存储过程参数与返回值的相关知识,包括参数类型、使用方法和最佳实践等内容。风哥教程参考MySQL官方文档MySQL Stored Procedures、MySQL Server Administration。 01 更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 参数类型

MySQL存储过程支持三种参数类型:IN、OUT和INOUT。不同类型的参数在存储过程中的作用不同。 02 学习交流加群风哥微信: itpux-com

# 存储过程参数类型

1. IN参数(输入参数)
– 默认参数类型
– 只能传入,不能修改
– 存储过程内部修改不影响外部变量

2. OUT参数(输出参数)
– 只能传出
– 存储过程内部修改会返回给调用者
– 调用时需要传入变量接收返回值

3. INOUT参数(输入输出参数)
– 既能传入也能传出
– 存储过程内部修改会返回给调用者
– 调用时需要传入变量

Part02-生产环境规划与建议

2.1 IN参数使用

IN参数是存储过程的输入参数,用于向存储过程传递数据。 03 学习交流加群风哥QQ113257174

# IN参数使用示例

1. 创建带IN参数的存储过程
DELIMITER //

CREATE PROCEDURE get_user_by_id(IN user_id INT)
BEGIN
SELECT id, user_name, email, created_at
FROM users
WHERE id = user_id;
END //

DELIMITER ;

输出示例:
Query OK, 0 rows affected (0.01 sec)

2. 调用存储过程
CALL get_user_by_id(1);

输出示例:
+—-+———–+——————+———————+
| id | user_name | email | created_at |
+—-+———–+——————+———————+
| 1 | user001 | user001@test.com | 2026-04-01 10:00:00 |
+—-+———–+——————+———————+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)

3. 创建带多个IN参数的存储过程
DELIMITER //

CREATE PROCEDURE get_users_by_range(
IN start_id INT,
IN end_id INT,
IN status INT
)
BEGIN
SELECT id, user_name, email, status
FROM users
WHERE id BETWEEN start_id AND end_id
AND status = status
ORDER BY id;
END //

DELIMITER ;

输出示例:
Query OK, 0 rows affected (0.01 sec)

4. 调用带多个IN参数的存储过程
CALL get_users_by_range(1, 10, 1);

输出示例:
+—-+———–+——————+——–+
| id | user_name | email | status |
+—-+———–+——————+——–+
| 1 | user001 | user001@test.com | 1 |
| 2 | user002 | user002@test.com | 1 |
| 3 | user003 | user003@test.com | 1 |
+—-+———–+——————+——–+
3 rows in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)

Part03-生产环境项目实施方案

3.1 OUT参数使用

OUT参数是存储过程的输出参数,用于从存储过程返回数据。 04 风哥提示:

# OUT参数使用示例

1. 创建带OUT参数的存储过程
DELIMITER //

CREATE PROCEDURE get_user_count(
IN status INT,
OUT user_count INT
)
BEGIN
SELECT COUNT(*) INTO user_count
FROM users
WHERE status = status;
END //

DELIMITER ;

输出示例:
Query OK, 0 rows affected (0.01 sec)

2. 调用存储过程
SET @count = 0;
CALL get_user_count(1, @count);
SELECT @count AS active_user_count;

输出示例:
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.01 sec)

+——————–+
| active_user_count |
+——————–+
| 1000 |
+——————–+
1 row in set (0.00 sec)

3. 创建带多个OUT参数的存储过程
DELIMITER //

CREATE PROCEDURE get_user_statistics(
OUT total_users INT,
OUT active_users INT,
OUT inactive_users INT
)
BEGIN
SELECT COUNT(*) INTO total_users FROM users;
SELECT COUNT(*) INTO active_users FROM users WHERE status = 1;
SELECT COUNT(*) INTO inactive_users FROM users WHERE status = 0;
END //

DELIMITER ;

输出示例:
Query OK, 0 rows affected (0.01 sec)

4. 调用存储过程
CALL get_user_statistics(@total, @active, @inactive);
SELECT @total AS total, @active AS active, @inactive AS inactive;

输出示例:
Query OK, 0 rows affected (0.01 sec)

+——-+——–+———–+
| total | active | inactive |
+——-+——–+———–+
| 1500 | 1000 | 500 |
+——-+——–+———–+
1 row in set (0.00 sec)

Part04-生产案例与实战讲解

4.1 INOUT参数使用

INOUT参数既可以传入数据,也可以返回修改后的数据。 05更多学习教程公众号风哥教程itpux_com

# INOUT参数使用示例

1. 创建带INOUT参数的存储过程
DELIMITER //

CREATE PROCEDURE increment_value(INOUT value INT, IN increment INT)
BEGIN
SET value = value + increment;
END //

DELIMITER ;

输出示例:
Query OK, 0 rows affected (0.01 sec)

2. 调用存储过程
SET @num = 10;
SELECT @num AS before_call;

输出示例:
+————–+
| before_call |
+————–+
| 10 |
+————–+
1 row in set (0.00 sec)

CALL increment_value(@num, 5);
SELECT @num AS after_call;

输出示例:
Query OK, 0 rows affected (0.01 sec)

+————-+
| after_call |
+————-+
| 15 |
+————-+
1 row in set (0.00 sec)

3. 创建复杂的INOUT参数示例
DELIMITER //

CREATE PROCEDURE calculate_discount(
INOUT price DECIMAL(10,2),
IN discount_rate DECIMAL(5,2)
)
BEGIN
DECLARE discount_amount DECIMAL(10,2);
SET discount_amount = price * discount_rate / 100;
SET price = price – discount_amount;
END //

DELIMITER ;

输出示例:
Query OK, 0 rows affected (0.01 sec)

4. 调用存储过程
SET @product_price = 100.00;
SELECT @product_price AS original_price;

输出示例:
+—————-+
| original_price |
+—————-+
| 100.00 |
+—————-+
1 row in set (0.00 sec)

CALL calculate_discount(@product_price, 10);
SELECT @product_price AS discounted_price;

输出示例:
+——————+
| discounted_price |
+——————+
| 90.00 |
+——————+
1 row in set (0.00 sec)

Part05-风哥经验总结与分享

5.1 返回值处理

MySQL存储过程可以通过OUT参数或SELECT语句返回数据。

# 返回值处理示例

1. 使用OUT参数返回单个值
DELIMITER //

CREATE PROCEDURE get_max_user_id(OUT max_id INT)
BEGIN
SELECT MAX(id) INTO max_id FROM users;
END //

DELIMITER ;

输出示例:
Query OK, 0 rows affected (0.01 sec)

2. 调用存储过程
CALL get_max_user_id(@max_id);
SELECT @max_id AS max_user_id;

输出示例:
Query OK, 0 rows affected (0.01 sec)

+————–+
| max_user_id |
+————–+
| 1500 |
+————–+
1 row in set (0.00 sec)

3. 使用SELECT返回结果集
DELIMITER //

CREATE PROCEDURE get_top_users(IN limit_num INT)
BEGIN
SELECT id, user_name, email, created_at
FROM users
ORDER BY created_at DESC
LIMIT limit_num;
END //

DELIMITER ;

输出示例:
Query OK, 0 rows affected (0.01 sec)

4. 调用存储过程
CALL get_top_users(5);

输出示例:
+—-+———–+——————+———————+
| id | user_name | email | created_at |
+—-+———–+——————+———————+
| 1500| user1500 | user1500@test.com | 2026-04-04 09:00:00 |
| 1499| user1499 | user1499@test.com | 2026-04-04 08:59:00 |
| 1498| user1498 | user1498@test.com | 2026-04-04 08:58:00 |
+—-+———–+——————+———————+
3 rows in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)

5. 混合使用OUT参数和结果集
DELIMITER //

CREATE PROCEDURE get_user_summary(
IN user_id INT,
OUT order_count INT,
OUT total_amount DECIMAL(10,2)
)
BEGIN
SELECT COUNT(*), SUM(amount)
INTO order_count, total_amount
FROM orders
WHERE user_id = user_id;

SELECT id, user_name, email
FROM users
WHERE id = user_id;
END //

DELIMITER ;

输出示例:
Query OK, 0 rows affected (0.01 sec)

6. 调用存储过程
CALL get_user_summary(1, @order_count, @total_amount);

输出示例:
+—-+———–+——————+
| id | user_name | email |
+—-+———–+——————+
| 1 | user001 | user001@test.com |
+—-+———–+——————+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)

SELECT @order_count, @total_amount;

输出示例:
+————–+————–+
| @order_count | @total_amount|
+————–+————–+
| 50 | 5000.00 |
+————–+————–+
1 row in set (0.00 sec)

6. 最佳实践

6.1 参数使用最佳实践

存储过程参数使用的最佳实践: 06 from mysql视频:www.itpux.com

# 参数使用最佳实践

1. 参数命名规范
– 使用有意义的参数名
– 避免使用保留字
– 保持命名一致性

2. 参数验证
– 在存储过程开始时验证参数
– 提供默认值
– 处理NULL值

3. 参数类型选择
– 根据实际需求选择参数类型
– IN参数用于输入数据
– OUT参数用于返回单个值
– INOUT参数用于需要修改的参数

4. 文档说明
– 为每个参数添加注释
– 说明参数用途和类型
– 提供调用示例

GF-MySQL数据库培训文档系列

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息