MySQL 存储过程
存储过程是一组预先编译好的 SQL 语句集合,封装在数据库中,通过“调用”执行,主要用于实现复杂的批量业务逻辑(如批量生成订单、同步数据等),减少客户端与数据库的交互次数,提升性能。
存储过程的核心优势
- 减少网络开销:客户端只需发送“调用指令”,无需传输大量 SQL 语句;
- 提高安全性:可通过权限控制存储过程的调用(如只允许调用,不允许直接操作表);
- 代码复用:一次定义,多次调用,避免重复编写相同 SQL;
- 事务可控:支持在存储过程中嵌入事务逻辑,保证批量操作的原子性。
存储过程的语法(含参数类型)
MySQL 存储过程支持三种参数类型:
IN:输入参数(默认,客户端向存储过程传值);OUT:输出参数(存储过程向客户端返回值);INOUT:输入输出参数(既传值,又返回值)。
语法格式
-- 创建存储过程
DELIMITER //
CREATE PROCEDURE 存储过程名(IN 参数1 类型, OUT 参数2 类型, INOUT 参数3 类型)
BEGIN-- 存储过程体(SQL语句集合,可包含变量定义、条件判断、循环、事务等)DECLARE 局部变量 类型 DEFAULT 默认值; -- 定义局部变量(仅在过程内有效)-- 示例1:条件判断(IF-ELSE)IF 参数1 > 10 THENSET 参数2 = 参数1 * 2;ELSESET 参数2 = 参数1 * 3;END IF;-- 示例2:循环(WHILE)WHILE 局部变量 < 5 DOINSERT INTO test_table (col1) VALUES (局部变量);SET 局部变量 = 局部变量 + 1;END WHILE;-- 示例3:事务START TRANSACTION;UPDATE table1 SET col = col + 1 WHERE id = 1;COMMIT;
END //
DELIMITER ;-- 调用存储过程
SET @out_param = 0; -- 定义会话变量接收OUT参数(客户端可见)
SET @inout_param = 2; -- 定义INOUT参数的初始值
CALL 存储过程名(5, @out_param, @inout_param); -- 调用,传入参数-- 查看输出结果(OUT/INOUT参数的值)
SELECT @out_param, @inout_param;-- 删除存储过程
DROP PROCEDURE IF EXISTS 存储过程名;
示例:批量插入数据的存储过程
-- 需求:向 user 表插入 n 条测试数据(n 为输入参数)
DELIMITER //
CREATE PROCEDURE batch_insert_user(IN n INT)
BEGINDECLARE i INT DEFAULT 1; -- 循环计数器WHILE i <= n DOINSERT INTO user (username, age) VALUES (CONCAT('test_', i), 18 + (i % 10)); -- 用户名:test_1~test_n,年龄18~27SET i = i + 1;END WHILE;
END //
DELIMITER ;-- 调用存储过程:插入10条数据
CALL batch_insert_user(10);-- 查看结果
SELECT * FROM user;
