1. 存储过程

存储过程优势

  • 存储过程把经常使用的SQL语句或业务逻辑封装起来,预编译保存在数据库中,当需要时从数据库中直接调用,省去了编译的过程。
  • 提高了运行速度。
  • 同时降低网络数据传输量。

存储过程保存在mysql.proc表中。

2. 语法

2.1. 创建存储过程

CREATE PROCEDURE sp_name ([ proc_parameter [,proc_parameter ...]])
    routime_body

2.1.1. proc_parameter 的构成

[IN|OUT|INOUT] parameter_name type

描述

IN

输入参数

OUT

输出参数

INOUT

输入输出参数

param_name

参数名称

type

参数类型

2.2. 存储过程修改

ALTER语句修改存储过程只能修改存储过程的注释等无关紧要的东西,不能修改存储过程体,所以要修改存储过程,方法就是删除重建。

2.3. 删除存储过程

DROP PROCEDURE [IF EXISTS] sp_name

3. 查看及调用

查看存储过程列表

SHOW PROCEDURE STATUS;

查看存储过程定义

SHOW CREATE PROCEDURE sp_name

调用存储过程

CALL sp_name ([ proc_parameter [,proc_parameter ...]])
CALL sp_name

说明:当无参时,可以省略"()",当有参数时,不可省略"()”

4. 存储过程示例

创建无参存储过程

delimiter //
CREATE PROCEDURE showTime()
BEGIN
    SELECT now();
END//
delimiter ;


CALL showTime;

创建含参存储过程:只有一个IN参数

delimiter //
CREATE PROCEDURE selectById(IN uid SMALLINT UNSIGNED)
BEGIN
    SELECT * FROM students WHERE stuid = uid;
END//
delimiter ;


call selectById(2);

示例

delimiter //
CREATE PROCEDURE dorepeat(n INT)
BEGIN
    SET @i = 0;
    SET @sum = 0;
    REPEAT SET @sum = @sum+@i; SET @i = @i + 1;
    UNTIL @i > n END REPEAT;
END//
delimiter ;


CALL dorepeat(100);
SELECT @sum;

创建含参存储过程:包含IN参数和OUT参数

delimiter //
CREATE PROCEDURE deleteById(IN uid SMALLINT UNSIGNED, OUT num SMALLINT UNSIGNED)
BEGIN
    DELETE FROM students WHERE stuid = uid;
    SELECT row_count() into num;
END//
delimiter ;


call deleteById(2,@Line);
SELECT @Line;

说明:创建存储过程deleteById,包含一个IN参数和一个OUT参数。调用时,传入删除的ID和保存被修改的行数值的用户变量@Line,select @Line;输出被影响行数。

5. 流程控制

存储过程和函数中可以使用流程控制来控制语句的执行。

流程控制语句

描述

IF

用来进行条件判断。根据是否满足条件,执行不同语句。

CASE

用来进行条件判断,可实现比IF语句更复杂的条件判断。

LOOP

重复执行特定的语句,实现一个简单的循环。

LEAVE

用于跳出循环控制。

ITERATE

跳出本次循环,然后直接进入下一次循环。

REPEAT

有条件控制的循环语句。当满足特定条件时,就会跳出循环语句。

WHILE

有条件控制的循环语句。

书山有路勤为径,学海无涯苦作舟