Mysql 游标的定义与使用方式

创建游标:

首先在MySql中创建一张数据表:

CREATE TABLE IF NOT EXISTS `store` (  

`id` int(11) NOT NULL AUTO_INCREMENT,  

`name` varchar(20) NOT NULL,  

`count` int(11) NOT NULL DEFAULT '1',

PRIMARY KEY (`id`)  

ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7; 

INSERT INTO `store` (`id`, `name`, `count`) VALUES  

(1, 'android', 15),  

(2, 'iphone', 14),  

(3, 'iphone', 20),  

(4, 'android', 5),  

(5, 'android', 13),  

(6, 'iphone', 13)
我们现在要用存储过程做一个功能,统计iphone的总库存是多少,并把总数输出到控制台。

--在windows系统中写存储过程时,如果需要使用declare声明变量,需要添加这个关键字,否则会报错。  

delimiter // 

drop procedure if exists StatisticStore; 

CREATE PROCEDURE StatisticStore()  

BEGIN

--创建接收游标数据的变量

declare c int;

declare n varchar(20);

--创建总数变量

declare total int default 0;

--创建结束标志变量

declare done int default false;

--创建游标

declare cur cursor for select name,count from store where name = 'iphone';

--指定游标循环结束时的返回值

declare continue HANDLER for not found set done = true;

--设置初始值

set total = 0;

--打开游标

open cur;

--开始循环游标里的数据

read_loop:loop

--根据游标当前指向的一条数据

fetch cur into n,c;

--判断游标的循环是否结束

if done then

leave read_loop; --跳出游标循环

end if;

--获取一条数据时,将count值进行累加操作,这里可以做任意你想做的操作,

set total = total + c;

--结束游标循环

end loop;

--关闭游标

close cur;

--输出结果 

select total;

END;

-调用存储过程 

call StatisticStore();

fetch是获取游标当前指向的数据行,并将指针指向下一行,当游标已经指向最后一行时继续执行会造成游标溢出。
使用loop循环游标时,他本身是不会监控是否到最后一条数据了,像下面代码这种写法,就会造成死循环;

read_loop:loop  

fetch cur into n,c;  

set total = total+c;  

end loop; 

在MySql中,造成游标溢出时会引发mysql预定义的NOT FOUND错误,所以在上面使用下面的代码指定了当引发not found错误时定义一个continue 的事件,指定这个事件发生时修改done变量的值。
declare continue HANDLER for not found set done = true; 

所以在循环时加上了下面这句代码。

--判断游标的循环是否结束  

if done then  

leave read_loop;    --跳出游标循环 

end if;

如果done的值是true,就结束循环。继续执行下面的代码。
 
 
 
 
posted on 2017-12-15 11:49  滴水之光  阅读(797)  评论(0编辑  收藏  举报