在 MySQL 开源数据库中,存储过程(Stored Procedure)是一组预先编译好的 SQL 语句集合,存放在数据库中,可以重复调用。下面我用概念 + 语法 + 实用示例的方式给你讲清楚。
存储过程是:
✅ 优点:
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();
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);
DELIMITER $$
CREATE PROCEDURE count_users(OUT total INT)
BEGIN
SELECT COUNT(*) INTO total FROM user;
END$$
DELIMITER ;
CALL count_users(@total);
SELECT @total;
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
DECLARE total INT DEFAULT 0;
IF age > 18 THEN
SELECT '成年人';
ELSE
SELECT '未成年人';
END IF;
CASE grade
WHEN 1 THEN SELECT '一年级';
WHEN 2 THEN SELECT '二年级';
ELSE SELECT '其他';
END CASE;
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;
| 对比项 | 存储过程 | 函数 |
|---|---|---|
| 是否返回值 | 可有多个 OUT | 必须有 RETURN |
| 调用方式 | CALL | SELECT |
| 是否执行修改 | ✅ 可以 | ❌ 通常不行 |
| 用途 | 业务逻辑 | 计算 |
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;
✅ 适用场景:
❌ 不建议:
如果你愿意,我可以帮你:
你现在是 学习 还是 实际项目在用?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。