MySQL 存储过程

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 THEN
        SET 参数2 = 参数1 * 2;
    ELSE
        SET 参数2 = 参数1 * 3;
    END IF;
    
    -- 示例2:循环(WHILE)
    WHILE 局部变量 < 5 DO
        INSERT 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)
BEGIN
    DECLARE i INT DEFAULT 1;  -- 循环计数器
    WHILE i <= n DO
        INSERT INTO user (username, age) 
        VALUES (CONCAT('test_', i), 18 + (i % 10));  -- 用户名:test_1~test_n,年龄18~27
        SET i = i + 1;
    END WHILE;
END //
DELIMITER ;

-- 调用存储过程:插入10条数据
CALL batch_insert_user(10);

-- 查看结果
SELECT * FROM user;
posted @ 2025-10-29 16:03  Jing61  阅读(7)  评论(0)    收藏  举报