8.存储过程_case (选择结构)
(1).case_语法
1.第一种语法:
case 表达式 when 条件1 then 执行语句1 [when 条件2 then 执行语句2]... [else 执行语句n] end case;
2.第二种语法:
case when 条件1 then 执行语句1 [when 条件2 then 执行语句2]... [else 执行语句n] end case;
(2).case_示列
- 根据传入的月份,判断月份所属的季节(要求采用case结构)。
-- 1-3月份 第一节度。 4-6月份 第二季度 7-9 为第三季度 create procedure p7(in `month` int, out seat varchar(10)) begin -- 1.设置月份 case when `month`>=1 and `month`<=3 then set seat := '第一季度'; when `month`>=4 and `month`<=6 then set seat := '第二季度'; when `month`>=7 and `month`<=9 then set seat := '第三季度'; when `month`>=10 and `month`<=12 then set seat := '第四季度'; end case; end; -- 2.调用函数 call p7(5,@seat1); -- 3.查询用户变量 select @seat1;
9.存储过程_while (循环结构)
(1).while_语法
while 循环时有条件的循环控制语句。满足条件后,再执行循环体中的SQL语句。
# 先判定条件,如果条件为true,则执行逻辑,否则,不执行逻辑 while 条件 do SQL逻辑... end while;
(2).while_示列
- 计算从1累加到100的值.
-- 1.定义局部变量, create procedure p9() begin # 1.1 创建局部变量 declare count int default 0; # 1.2循环 while count<=100 do # 1.3进行累加 set count := `count`+1; end while; select count; end; #查看 call p9;
10.存储过程_repeat (循环结构)
(1).repeat_语法
repeat是有条件的循环控制语句,当满足条件的时候退出循坏。具体语法:
先执行一次逻辑,然后判定逻辑是否满足,如果满足,则退出;如果不满足,则继续下一次循环。 (类似于Java的 do while(){})
repeat SQL逻辑...; until 条件 #这里不能有分号 end repeat;
(2).repeat_示列
- 计算从1累加到n得值,n为传入的参数值。
-- 1.函数 create procedure p10(in n int) begin -- 2.创建一个局部变量并设置默认值为0 declare total int default 0; -- 3.设置repeat repeat set total :=total +1; set n := n-1; until n<=0 end repeat; -- 查询 select total; end; call p10(10);
11.存储过程_loop (循环结构)
(1).loop_语法
loop 实现简单的循环,如果不在SQL逻辑中增加退出循环的条件,可以用其来实现简单的死循环。Loop可以配合一个两个语句使用:
- leave: 配合循环使用,
退出循环
。 类似于 break; - iterate: 必须用在循环中,作用是
跳过当前
循环剩下的语句,直接进入下一次循环。类似于 continue;
[开始标签]: loop SQL逻辑... end loop [结束标签];
leave 标签; -- 退出指定标记的循环体 iterate 标签; -- 直接进入下一次循环
(2).loop_示列
- 计算从1到n偶数累加的值,n为传入的参数值。
create procedure p1(in n int) begin -- 1. 声明一个局部变量 declare total int default 0; -- 2. 进行循环的操作 sum:loop -- 3. 判断是否小于0 离开 if n<0 then leave sum; end if; -- 4. 假如是奇数的话,跳过 if n%2 = 1 then set n := n-1; iterate sum; end if; -- 5. 加在一起 set total := total +n; set n := n-1; end loop sum; select total; end; call p1(10);
12.存储过程_cursor (游标)
(1).游标_介绍
游标(cursor) 是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明、open、fetch 和 close。 相当于说就是能够存储数组了。
(2).游标_语法
1.声明游标
declare 游标名称 cursor for 查询语句;
2.打开游标
open 游标名称;
3.获取游标记录
fetch 游标名称 into 变量 [,变量...];
4.关闭游标
close 游标名称;
(3).游标_示列
根据传入的参数uage,来查询用户表tb_user中,所有的用户年龄小于等于uage的用户姓名(name)和专业(profession),并将用户的姓名和专业插入到所创建的一张新表(id,name,profession)中.。
create procedure p1(in uage int) begin -- 1. 声明接受的值。 declare uname varchar(100); declare uprofession varchar(100); -- 2.声明游标 declare u_cursor cursor for select `name`,`profession` from tb_user2 where `age`<=uage; -- 3.如果表不存在就创建 drop table if exists tb_user_proinfo; create table if not exists tb_user_proinfo( id int(4) primary key auto_increment, name varchar(100), profession varchar(100) ); -- 4.开启游标 open u_cursor; -- 5. 循环 WHILE true DO -- 6.将数据插入信息 fetch u_cursor into uname,uprofession; -- 7. 插入新建的表中 insert into tb_user_proinfo values (null,uname,uprofession); END WHILE; -- 8. 关闭游标 close u_cursor; end; call p1(100); select *from tb_user_proinfo;
1.普通变量要比游标变量先声明
2.执行函数,但会报错。报错的原因当我们从游标读出来之后,还是一直循环的,所以会报错。
3.数据能够加入,但是调用函数的时候会报错
13.存储过程_handler(条件处理程序)
(1).条件处理程序_介绍
条件处理程序(Handler) 可以用来定义在流程控制结构执行过程中遇到的问题时相应的处理步骤。类似于 try catch(){}
(2).条件处理程序_语法
declare 处理程序类型 handler for 条件 [,条件2] ... SQLStatement; 处理程序类型: 1. continue: 继续执行当前程序 2. exit: 终止当前程序 条件: sqlstate sqlstate_value: 状态码 如02000 1. sqlwarning: 所有以01开头的sql状态码 2. not forun: 所有以02开头的sql状态码 3. sqlexception: 所有没有被01 或02 开头的状态码。
(3).修复游标残留下的问题
create procedure p1(in uage int) begin -- 1. 声明接受的值。 declare uname varchar(100); declare uprofession varchar(100); -- 2.声明游标 declare u_cursor cursor for select `name`,`profession` from tb_user2 where `age`<=uage; -- 声明条件处理程序,当状态码为0200的时候退出并关闭游标 ⭐ declare exit handler for sqlstate '02000'close u_cursor; -- 3.如果表不存在就创建 drop table if exists tb_user_proinfo; create table if not exists tb_user_proinfo( id int(4) primary key auto_increment, name varchar(100), profession varchar(100) ); -- 4.开启游标 open u_cursor; -- 5. 循环 WHILE true DO -- 6.将数据插入信息 fetch u_cursor into uname,uprofession; -- 7. 插入新建的表中 insert into tb_user_proinfo values (null,uname,uprofession); END WHILE; -- 8. 关闭游标 ⭐⭐ # close u_cursor; end; call p1(100); select *from tb_user_proinfo;