Skip to content

MySQL 存储过程

存储过程是一组保存在数据库中的 SQL 语句,适合封装批处理、复杂数据修正、定时任务等逻辑。

业务系统中不要滥用存储过程。跨服务、跨数据库迁移和版本管理会更复杂。

创建

sql
DELIMITER $$

CREATE PROCEDURE create_order(
  IN p_user_id BIGINT,
  IN p_amount DECIMAL(10, 2),
  OUT p_order_id BIGINT
)
BEGIN
  INSERT INTO orders (user_id, amount)
  VALUES (p_user_id, p_amount);

  SET p_order_id = LAST_INSERT_ID();
END $$

DELIMITER ;

参数模式:

  • IN:输入参数。
  • OUT:输出参数。
  • INOUT:既作为输入,也作为输出。

调用

sql
CALL create_order(1, 99.00, @order_id);
SELECT @order_id;

查看和删除

sql
SHOW PROCEDURE STATUS WHERE Db = DATABASE();
SHOW CREATE PROCEDURE create_order;
DROP PROCEDURE IF EXISTS create_order;

常见注意点

  • 存储过程内部每条 SQL 仍需要分号。
  • 创建过程时通常需要临时修改 DELIMITER
  • 复杂逻辑要注意事务边界和异常处理。
  • 应用层和数据库层不要重复维护同一套业务规则。

基于 MIT 许可发布