MYSQL流程控制

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('销售部');
  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值