创建游标:

首先在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;

fetch是获取游标当前指向的数据行,并将指针指向下一行,当游标已经指向最后一行时继续执行会造成游标溢出。
end loop; 

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

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

end if;

如果done的值是true,就结束循环。继续执行下面的代码。
 
 
 
 

相关文章: