Mysql存储过程

1. 什么是存储过程?

  • 存储过程是预编译好的 SQL 代码块,存放在数据库里。

  • 你可以带参数调用它,实现复杂的逻辑处理,比如条件判断、循环、事务等。

  • 好处是减少网络传输,多次调用时执行效率更高。


2. 存储过程的基本结构

DELIMITER $$

CREATE PROCEDURE procedure_name (IN param1 INT, OUT param2 VARCHAR(20))
BEGIN
    -- 这里写过程体,比如变量声明,条件判断,SQL操作等
END $$

DELIMITER ;
  • DELIMITER 是切换命令结束符,防止过程体里的分号被误解析。

  • 参数可以是 IN(输入)、OUT(输出)、INOUT(输入输出)。


3. 简单示例

假设有个学生表 student (sid, name, score),写个存储过程判断分数好坏。

DELIMITER $$

CREATE PROCEDURE checkScore(
    IN sid_in INT,
    OUT result VARCHAR(20)
)
BEGIN
    DECLARE score_val INT;

    SELECT score INTO score_val FROM student WHERE sid = sid_in;

    IF score_val > 85 THEN
        SET result = '考得好';
    ELSE
        SET result = '考不好';
    END IF;
END $$

DELIMITER ;

调用:

CALL checkScore(1001, @res);
SELECT @res;

4. 注意点

  • 查询单个值用 SELECT ... INTO 语法。

  • 控制结构支持 IF, CASE, WHILE, LOOP, REPEAT 等。

  • 一定要切换 DELIMITER,否则过程定义会出错。

  • 调试时建议先写简单语句逐步调试。


5. Java 调用存储过程示例

用 JDBC 调用带输入输出参数的存储过程:

CallableStatement cs = conn.prepareCall("{CALL checkScore(?, ?)}");
cs.setInt(1, 1001);      // IN 参数
cs.registerOutParameter(2, Types.VARCHAR);  // OUT 参数
cs.execute();
String result = cs.getString(2);
System.out.println("结果: " + result);

6. 小提示

  • 存储过程适合复杂业务逻辑,比如批量处理、统计、校验等。

  • 也别滥用,逻辑写太多数据库层会让维护变复杂。

  • 结合事务控制,存储过程能保证操作的原子性。

你可能感兴趣的:(mysql)