MYSQL流程控制
本篇博客对MySQL中的流程控制进行介绍,包括if判断,循环中的while,Repeat,loop以及一个关于游标的例子。
if判断
判断
-- 判断
-- 案例一
-- 输入学生成绩来判断成绩的级别
delimiter $$
create procedure proc_12_if(in score int)
BEGIN
if score<60
THEN
select '不及格';
elseif score>=60 and score<80
then
select '及格';
elseif score>=80 and score<90
then
select '良好';
elseif score>=90 and score<=100
then
select '优秀';
ELSE
select '成绩错误';
end if;
END$$
delimiter;
set @score=65;
call proc_12_if(@score)
when:
在SQL中,when方法类似于java中的switch
while循环:
use mysql7_procedure;
create table user(
uid int primary key,
username varchar(20),
password varchar(20)
);
create table user(
uid int primary key,
username varchar(20),
password varchar(20)
);
-- 向表中添加10条数据
delimiter$$
create procedure proc11_while(in insertCount int)
begin
declare i int default 1;
while i<=insertCount do
insert into user(uid,username,password)values(i,concat('user-',i),'123456');
set i=i+1;
end while;
end$$
delimiter;
call proc11_while(10);
LEAVE的作用相当于break
-- 存储过程-循环控制-while+LEAVE(相当于break)
truncate table user;
delimiter$$
create procedure proc12_while_leave(in insertCount int)
begin
declare i int default 1;
label:while i<=insertCount do
insert into user(uid,username,password)values(i,concat('user-',i),'123456');
if i=5 then
leave label;
end if;
set i=i+1;
end while label;
end$$
delimiter;
call proc12_while_leave(10);
use mysql7_procedure;
create table user2(
uid int ,
username varchar(20),
password varchar(20)
);
truncate table user;
delimiter$$
create procedure proc13_while_iterate(in insertCount int)
begin
declare i int default 1;
label:while i<=insertCount do
insert into user2(uid,username,password)values(i,concat('user-',i),'123456');
if i=5 then
iterate label;
end if;
set i=i+1;
end while label;
end$$
delimiter;
call proc13_while_iterate(10);
同样,Iterate相当于continue
Repeat,跟死循环类似
use mysql7_procedure;
truncate table user;
delimiter$$
create procedure proc14_while_repeat(in insertCount int)
begin
declare i int default 1;
label:repeat
insert into user(uid,username,password)values(i,concat('user-',i),'123456');
set i=i+1;
until i>insertCount
end repeat label;
select '循环结束';
end$$
delimiter;
call proc14_while_repeat(10);
loop循环
use mysql7_procedure;
truncate table user;
delimiter $$
create procedure proc15_loop(in insertCount int)
begin
declare i int default 1;
label:loop
insert into user(uid,username,password) values(i,concat('user-',i),'123456');
set i=i+1;
end loop label;
end $$
delimiter;
call proc15_loop(10);
储存过程之游标
是用来储存查询结果集的数据类型,在存储过程和函数中可以使用光标对结果集进行循环的处理。光标的使用包括光标的声明,open,FETCH,CLOSE。
use mysql7_procedure;
-- 输入一个部门名,查询该部门员工的编号,名字,薪资,将查询的结果集添加游标
delimiter $$
create procedure proc15_cursor(in in_dname varchar(50))
BEGIN
-- 定义局部变量
declare var_empno int;
declare var_ename varchar(50);
declare var_sal decimal(7,2);
-- 声明游标
declare my_cursor cursor FOR
select empno,ename,sal from dept a,emp b where a.deptno=b.deptno and a.dname=in_dname;
-- 打开游标
open my_cursor;
-- 通过游标取值
label:loop
fetch my_cursor into var_empno,var_ename, var_sal ;
select var_empno,var_ename, var_sal;
end loop label;
-- 关闭游标
close my_cursor;
end $$ ;
delimiter;
call proc15_cursor('销售部');
关于句柄
相当于java中的try catch
use mysql7_procedure;
-- 输入一个部门名,查询该部门员工的编号,名字,薪资,将查询的结果集添加游标
delimiter $$
create procedure proc16_cursor_gandler(in in_dname varchar(50))
BEGIN
-- 定义局部变量
declare var_empno int;
declare var_ename varchar(50);
declare var_sal decimal(7,2);
-- 定义标记值
declare flag int default 1;
-- 声明游标
declare my_cursor cursor FOR
select empno,ename,sal from dept a,emp b where a.deptno=b.deptno and a.dname=in_dname;
-- 定义句柄
/*
1.异常处理完之后程序如何执行
continue:继续执行剩下的代码
exit:直接终止程序
undo:不支持
2.触发条件
条件码
1329
条件名
SQLWARNING
NOT FOUND
SQLEXCEPTION
3.异常触发后怎么继续执行
*/
declare continue handler for 1329 set flag=0;
-- 打开游标
open my_cursor;
-- 通过游标取值
label:loop
fetch my_cursor into var_empno,var_ename, var_sal ;
-- 判断标记位看是否能执行
if flag=1
then
select var_empno,var_ename, var_sal;
else
leave label;
end if;
end loop label;
-- 关闭游标
close my_cursor;
end $$ ;
delimiter;
call proc16_cursor_gandler('销售部');