黑白分明的语法结构、逻辑清晰的流程控制,再加上不少能提升效率的小技巧,MySQL 的存储过程算是蛮值得一学的工具了。你要是经常在项目里跑重复 SQL,那存储过程就香。

MySQL 5.0开始支持存储过程,一下子让数据库不只是个数据仓库,而更像是个“有脑子”的业务层。简单说,就是你可以把一段常用 SQL 逻辑封装好,想用就CALL一下,方便还省事。

比如你想做个提示信息的存储过程,几行 SQL 就搞定:

DELIMITER //
CREATE PROCEDURE my_procedure()
BEGIN
  SELECT 'Hello, this my procedure!';
END //
DELIMITER ;

你只要CALL my_procedure();,信息就自动出来了,嗯,挺顺手的。

那为啥用它?是安全性好,用户只能调用你开放的过程,误操作风险小。执行效率高,只编译一次,调用多次。网络开销也少,一次传个过程名,后台自己逻辑。还能复用代码,尤其对复杂业务场景,比如财务系统,代码不重复,维护还方便。

要注意写法:DELIMITER是个关键点,能避免和;冲突。变量声明、条件判断、循环这些在过程里都能用,嗯,就像写小脚本一样灵活。流程控制语句比如IFWHILECASE,基本全支持。

稍复杂点的场景,比如算奖金这种,也可以搞定。像这样:

DELIMITER //
CREATE PROCEDURE calculate_bonus(IN emp_id INT, IN position VARCHAR(50), IN performance INT, OUT bonus DECIMAL(10,2))
BEGIN
  DECLARE base_salary DECIMAL(10,2);
  SET base_salary = (SELECT salary FROM employees WHERE id = emp_id);
  IF position = 'Manager' THEN
    SET bonus = base_salary * 0.15;
  ELSEIF position = 'Engineer' THEN
    CASE performance
      WHEN 1 THEN SET bonus = base_salary * 0.10;
      WHEN 2 THEN SET bonus = base_salary * 0.12;
      WHEN 3 THEN SET bonus = base_salary * 0.15;
      ELSE SET bonus = base_salary * 0.05;
    END CASE;
  ELSE
    SET bonus = base_salary * 0.05;
  END IF;
END //
DELIMITER ;

调用也简单:

DECLARE @bonus DECIMAL(10,2);
CALL calculate_bonus(1, 'Engineer', 3, @bonus);
SELECT @bonus;

想用好存储过程,你可以顺便了解下函数、自定义变量和游标,用起来更灵活。顺手贴几个参考资料:

如果你在项目里有重复逻辑、性能要求高或者对权限控制比较敏感,那存储过程就适合上手。多写几个试试看,写顺手了,比拼 SQL 拼接强多了!