温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

MySQL开源数据库存储过程怎么用

发布时间:2026-07-01 06:48:33 来源:亿速云 阅读:87 作者:小樊 栏目:系统运维

MySQL 开源数据库中,存储过程(Stored Procedure)是一组预先编译好的 SQL 语句集合,存放在数据库中,可以重复调用。下面我用概念 + 语法 + 实用示例的方式给你讲清楚。


一、什么是存储过程?

存储过程是:

  • 一组 SQL 语句
  • 存储在数据库中
  • 可接受参数、执行逻辑判断、循环
  • 被客户端或应用程序调用

✅ 优点:

  • 提高复用性
  • 减少网络传输
  • 封装业务逻辑
  • 提高执行效率(预编译)

二、存储过程基本语法

1️⃣ 创建存储过程

DELIMITER $$

CREATE PROCEDURE 存储过程名([参数])
BEGIN
    -- SQL 语句
END$$

DELIMITER ;

⚠️ DELIMITER 是为了避免 ; 被 MySQL 提前解析


三、无参数存储过程示例

示例:查询所有用户

DELIMITER $$

CREATE PROCEDURE get_all_users()
BEGIN
    SELECT * FROM user;
END$$

DELIMITER ;

调用存储过程

CALL get_all_users();

四、带输入参数(IN)

示例:根据 ID 查询用户

DELIMITER $$

CREATE PROCEDURE get_user_by_id(IN uid INT)
BEGIN
    SELECT * FROM user WHERE id = uid;
END$$

DELIMITER ;

调用

CALL get_user_by_id(1);

五、带输出参数(OUT)

示例:统计用户数量

DELIMITER $$

CREATE PROCEDURE count_users(OUT total INT)
BEGIN
    SELECT COUNT(*) INTO total FROM user;
END$$

DELIMITER ;

调用

CALL count_users(@total);
SELECT @total;

六、输入输出参数(INOUT)

DELIMITER $$

CREATE PROCEDURE add_one(INOUT num INT)
BEGIN
    SET num = num + 1;
END$$

DELIMITER ;

调用

SET @n = 5;
CALL add_one(@n);
SELECT @n;  -- 6

七、存储过程中的变量与控制语句

1️⃣ 变量定义

DECLARE total INT DEFAULT 0;

2️⃣ IF 判断

IF age > 18 THEN
    SELECT '成年人';
ELSE
    SELECT '未成年人';
END IF;

3️⃣ CASE 判断

CASE grade
    WHEN 1 THEN SELECT '一年级';
    WHEN 2 THEN SELECT '二年级';
    ELSE SELECT '其他';
END CASE;

4️⃣ 循环(WHILE)

DECLARE i INT DEFAULT 1;

WHILE i <= 5 DO
    INSERT INTO test(value) VALUES(i);
    SET i = i + 1;
END WHILE;

八、查看、修改、删除存储过程

查看存储过程

SHOW PROCEDURE STATUS WHERE Db = 'test_db';

查看定义

SHOW CREATE PROCEDURE get_user_by_id;

删除存储过程

DROP PROCEDURE IF EXISTS get_user_by_id;

九、存储过程 vs 函数(简单对比)

对比项 存储过程 函数
是否返回值 可有多个 OUT 必须有 RETURN
调用方式 CALL SELECT
是否执行修改 ✅ 可以 ❌ 通常不行
用途 业务逻辑 计算

十、综合示例(常见业务)

插入用户并返回新 ID

DELIMITER $$

CREATE PROCEDURE add_user(
    IN p_name VARCHAR(50),
    OUT new_id INT
)
BEGIN
    INSERT INTO user(name) VALUES(p_name);
    SET new_id = LAST_INSERT_ID();
END$$

DELIMITER ;

调用

CALL add_user('张三', @id);
SELECT @id;

十一、使用建议 ⚠️

✅ 适用场景:

  • 复杂业务逻辑
  • 多次重复的 SQL
  • 数据批量处理

❌ 不建议:

  • 大量复杂业务逻辑(难维护)
  • 过度依赖数据库逻辑

如果你愿意,我可以帮你:

  • ✅ 写一个你业务场景的存储过程
  • ✅ 对比 MySQL 8.0 新特性
  • ✅ 讲 存储过程调试技巧
  • ✅ 说明 和事务、游标结合使用

你现在是 学习 还是 实际项目在用

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI