为什么使用游标
有时需要在检索出来的行中前进或后移。
MySQL游标只能用于存储过程(存储过程完成后,游标就会消失)。
游标主要应用于交互式应用,用户需要滚动屏幕上的数据,并对数据进行浏览或做出修改。
使用游标步骤:
1、使用前必须声明(declare),这个过程并没有检索数据,只是定义要使用的selete语句;
2、一旦声明,必须打开(open)以供使用。这个过程用selete把数据实际检索出来;
3、对于填索数据的游标,根据需要取出各行;
4、在结束游标使用时,必须关闭(close)。
创建游标-declare
例:
create procedure processorders()
begin
declare ordernumberscursor //ordernumbers游标名
for
selete orders_num from orders;
end;
打开/关闭游标
open ordernumbers;
close ordernumbers; //close释放游标使用的所有内存和资源。
注:一个游标关闭后,如果没有重新打开,则不能使用。
使用游标访问数据–fetch
例1:
create procedure processorders()
begin
declare o INT; //声明变量 o
declare ordernumbers cursor //声明并定义游标ordernumbers
for
selete orders_num from orders;
open ordernumbers;
fetch ordernumbers into o;
//fetch检索当前行的orders_num列到一个名为o的局部声明的变量中
close ordernumbers;
end;
例2:循环检索
create procedure processorders()
begin
declare done BOOLEAN default 0; //声明变量done,用于控制循环
declare o INT;
declare ordernumbers cursor //声明并定义游标ordernumbers
for
selete orders_num from orders;
declare CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1; //当SQLSTATE '02000' 出现时,done=1。当没有更多的行供循环时,会出现这个条件。
open ordernumbers;
repeat
fetch ordernumbers into o;
until done end repeat; //反复执行直到done为真
close ordernumbers;
end;
**注:**declare语句定义的局部变量,必须在定义任意游标之前定义,而句柄必须在游标之后定义。
(游标类似于编程语言如C++中的指针,声明并初始化之后才能使用;fetch类似于‘*’,访问数据;repeat相当于for,循环游标)
例3:
create procedure processorders()
begin
declare done BOOLEAN default 0;
declare o INT;
declare t decimal(8,2); //新的变量t
declare ordernumbers cursor
for
selete orders_num from orders;
declare continue handler for SQLstate'02000' set done=1; //当SQLSTATE '02000' 出现时,done=1。当没有更多的行供循环时,会出现这个条件。
create table if not exist ordertotal //创建一个表,用于存储结果
(order_num int,total decimal(8,2));
open ordernumbers;
repeat
fetch ordernumbers into o;
call ordertotal(o,1,t);
insert into ordertotal (order_num,total)
values(o,t);
until done end repeat; //反复执行直到done为真
close ordernumbers;
end;