这次接着说MySQL存储过程:

我们先看它的多分支控制结构case:

case的语句很简单:

case 变量名

when 条件1 then 输出结果1;

when 条件2 then 输出结果2;

......

end case;

那我们就来建立一个存储过程实现它:

create procedure p10()
begin
declare pos int default 0;
set pos:= floor(5*rand());
case pos
when 1 then select'我会飞';
when 2 then select'我掉到海里';
when 3 then select'我在小岛';
else select'我不知道我在哪';
end case;
end$

由于我们设置的是随机数,所以它会根据我们生成的数来输出结果

接着看一下repeat循环:

repeat的语法:

repeat

sql statement;

sql statement;

...

until condition end repeat;

create procedure p11()
begin
declare total int default 0;
declare i int default 0;
repeat
set i:=i+1;
set total:=total+i;
until i>=100
end repeat;
select total;
end$

游标:

一条sql,对应N条资源,取出资源的接口/句柄,就是游标

沿着游标,可以一次取出一行。

建立游标的语法:

declare 游标名 cursor for sql语句;

open 游标名

fetch 游标名 into 变量1,变量2,...变量N;

close 游标名

create procedure p12()
begin
declare row_gid int;
declare row_name varchar(20);
declare row_num int;
declare getgoods cursor for select gid,num,name from goods;
open getgoods;
fetch getgoods into row_gid,row_num,row_name;
select row_num,row_name;
close getgoods;
end$

那么我们看到这个输出结果没有什么特别的地方,那么如果我们把游标改一改?

create procedure p13()
begin
declare row_gid int;
declare row_name varchar(20);
declare row_num int;
declare getgoods cursor for select gid,num,name from goods;
open getgoods;
fetch getgoods into row_gid,row_num,row_name;
select row_num,row_name;
fetch getgoods into row_gid,row_num,row_name;
select row_num,row_name;
fetch getgoods into row_gid,row_num,row_name;
select row_num,row_name;
fetch getgoods into row_gid,row_num,row_name;
select row_num,row_name;
close getgoods;
end$

我们看到在输出了三行之后报错,那么我们可以把循环和游标结合起来:

create procedure p14()
begin
declare row_gid int;
declare row_name varchar(20);
declare row_num int;
declare cnt int default 0; #声明一个变量用来计数
declare i int default 0;
declare getgoods cursor for select gid,num,name from goods;
select count(*) into cnt from goods; #将总行数赋给cnt
open getgoods;
repeat
set i:=i+1;
fetch getgoods into row_gid,row_num,row_name;
select row_num,row_name;
until i>=cnt end repeat;
close getgoods;
end$

其实游标在越界时我们可以用declare continue handler 来操作一个越界标志

declare continue handler for NOT FOUND 可执行语句;

create procedure p15()
begin
declare row_gid int;
declare row_name varchar(20);
declare row_num int;
declare you int default 1;
declare getgoods cursor for select gid,num,name from goods;
declare continue handler for NOT FOUND set you:=0;
open getgoods;
repeat
fetch getgoods into row_gid,row_num,row_name;
select row_num,row_name;
until you=0 end repeat;
close getgoods;
end$

在上面的结果中我们发现最后一行被取了两次,这是为什么?

答:因为我们声明的是continue型handler,那么它在把you 这个变量改为0后还会接着执行后面的sql语句,我们把continue改为exit就不会出现这种情况了:

create procedure p15()
begin
declare row_gid int default 0;
declare row_num int default 0;
declare row_name varchar(20);
declare you int default 1;
declare getgoods cursor for select gid,num,name from goods;
declare exit handler for NOT FOUND set you:=0;
open getgoods;
repeat
fetch getgoods into row_gid,row_num,row_name;
select row_name,row_num;
until you=0 end repeat;
close getgoods;
end$

那么其实我们还有另一种方法来修改:我们使逻辑上更加通顺

create procedure p17()
begin
declare row_gid int;
declare row_num int;
declare row_name varchar(20);
declare you int default 1;
declare getgoods cursor for select gid,num,name from goods;
declare continue handler for NOT FOUND set you:=0;
open getgoods;
fetch getgoods into row_gid,row_num,row_name;
repeat
select row_name,row_num;
fetch getgoods into row_gid,row_num,row_name;
until you=0 end repeat;
close getgoods;
end$

或者是将repeat改为while循环,在这里我就不列举了。

最新文章

  1. [源码]ObjectIOStream 对象流 ByteArrayIOStream 数组流 内存流 ZipOutputStream 压缩流
  2. 数据结构与算法(1)支线任务8——Find Median from Data Stream
  3. LCC
  4. Java方法区和运行时常量池溢出问题分析
  5. Liferay 6.2 改造系列之二十三:修改Liferay原始主题中"技术支持:Liferay"字样
  6. 非常简单的XML解析(SAX解析、pull解析)
  7. java之对象转型2
  8. Nginx模块fastcgi_cache的几个注意点
  9. ScheduledExecutorService定时周期执行指定的任务
  10. SpringMVC简单构造restful, 并返回json
  11. 多台服务器最好加上相同的machineKey
  12. Java自定义比较器Comparator
  13. js数据显示在文本框中(页面加载显示和按钮触动显示)
  14. HDU1394(线段树||树状数组)
  15. c++ vector(向量)使用方法详解(顺序访问vector的多种方式)
  16. 20160211.CCPP体系详解(0021天)
  17. python10--函数的来源,优点,定义,组成,使用(定义,调用)函数的分类,函数的返回值
  18. Kubernetes节点维护
  19. Java虚拟机垃圾收集器
  20. 一个隐蔽的C语言问题反思

热门文章

  1. 【SpringBoot】SpringBoot配置与单元测试(二)
  2. SVM – 线性分类器
  3. 经典面试题之——如何自由转换两个没有继承关系的字段及类型相同的实体模型,AutoMapper?
  4. OpenShift 4.2环境离线部署Operatorhub
  5. (三)Java数据结构和算法——冒泡、选择、插入排序算法
  6. WPF--控件模板的视觉效果呈现流程及逻辑
  7. Ubuntu16.04环境下的硬盘挂载
  8. unity 在editor编辑器下创建多个按钮
  9. linux安装docker,并在docker上运行springboot项目
  10. UV数据与风速风向数据转换