内容简介:本文主要介绍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
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 风哥提示:
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
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. 文档说明
– 为每个参数添加注释
– 说明参数用途和类型
– 提供调用示例
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
