一、什么是存储过程
一段可以在数据库中执行的代码,保存在数据库中。
二、存储过程的作用
可以将一些重复使用的代码封装起来重复使用,比如构造数据、校验数据是否正确等
三、为什么不推荐使用存储过程
1)不方便迁移:存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
2)业务代码应该写在项目中而不是数据库中,存储过程是保存在数据库的。
PS: 猜测测试需要了解存储过程是因为存储过程可以方便的进行构造数据等操作,所以测试中存储过程在数据构造、校验等方面还是有应用的地方。
四、存储过程介绍
1. 创建存储过程
- 示例:
delimiter $$ #将语句的结束符号从分号;临时改为两个$$(可以是自定义)
CREATE PROCEDURE delete_matches(IN p_playerno INTEGER) # 创建名为 delete_matches 的存储过程
BEGIN
DELETE FROM MATCHES
WHERE playerno = p_playerno; # 删除 MATCHES 表的 playerno 字段 = 传入的参数 p_playerno 的值 的列
END$$
delimiter; #将语句的结束符号恢复为分号
- 语法说明:
1) CREATE PROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形...])
- IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
- OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
- INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
2)BEGIN ... END 存储过程体:包含了存储过程需要执行的代码(或者说SQL),从BEGIN 开始到END 结束。
2. 调用存储过程:call 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形…])
如:call delete_matches(57);
3. 变量
a. 定义:DECLARE variable_name [,variable_name...] datatype [DEFAULT value];
示例:DECLARE a int default 4;
解释:声明了整数类型的变量a,默认值是4。
b. 变量赋值:SET 变量名 = 表达式值 [,variable_name = expression ...]
示例:SET a = 1;
解释:设置变量a等于1
4. 控制语句
4.1. if-then-else 语句(if开始,end if 结束。表示如果满足XXX条件就执行XXXXXX):
if var=0 then
insert into t values(17); #如果var变量为0,执行插入语句
end if;
4.2. case语句(case 开始,when 进行判断,else表示不满足when的条件时,end case结束。表示当xxx时,执行XXXX,当xxx时,执行XXX):
case var # 开始判断变量var的值
when 0 then #如果var=0,执行下面的sql
insert into t values(17);
when 1 then #如果var=1,执行下面的sql
insert into t values(18);
else #var等于其他情况下,执行下面的sql
insert into t values(19);
end case; # 结束case判断
4.3. while ···· end while(循环语句,当满足条件时,执行XXX直到不满足这个条件时退出循环)
while var<6 do # 当变量var小于6时,执行下面语句
insert into t values(var); #执行插入sql
set var=var+1; #设置变量var+1,当var<6,继续上面的插入sql和+1,直至var不小于6就结束
end while; #while语法的结束写法
4.4. repeat···· until ···· end repeat (和while相似,只是while是先判断后执行,repeat是先执行后判断)
repeat
--循环体
until 循环条件
end repeat;
4.5. loop ····· leave ····· endloop(也是循环,leave表示离开循环)
LOOP_LABLE:loop # 开启loop循环,LOOP_LABLE是一个label标识,可以用来给这个循环打标,在leave离开循环时使用
insert into t values(v); #执行插入语句
set v=v+1; # 设置变量v加1
if v >=5 then # 判断变量v是不是大于等于5,如果是,执行下面语句
leave LOOP_LABLE; #满足if条件时,执行leave离开loop循环
end if; #if的结束语法
end loop; #loop的结束语法
4.6. iterate(和leave 相似,用来跳出循环)
add_num:loop #循环的开始
set flag=flag+1;
if flag>10 then leave add_num; #当flag>10时结束循环
elseif mod(flag,2)=1 then iterate add_num; #当flag时奇数时跳过本次循环,继续下次循环
else set input=input+flag; #计算0+2+4+...+10
end if;
end loop add_num;
PS: leave和 iterate 可以用在所有的循环语句中(while、repeat、loop),leave表示直接退出循环,iterate表示跳过本次循环进行下次循环