Mysql 学习笔记07
Mysql 的游标
游标的声明
declare + 游标名称 + cursor + for + selec语句
open +游标名称
fetch
close + 游标名称
游标取值越界时,有没有标识?利用标识来结束?
在mysql 的游标中 可以 使用 declare continue handler 来操作1个越界标识
declare continue handler for not found statement;o
create procedure p15()
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;
repeat
fetch getgoods into row_gid,row_num,row_name;
select row_num,row_name;
until you = 0 end repeat;
close getgoods;
end;
上面的p15()是存在逻辑错误的。它会把最后一条数据取两遍,因为是用来 continuce handler for 在 满足 for not found 条件后,还是会继续执行下去, 修改方式了使用 exit handler 代替。
exit 与 continue的区别是 exit 触发后,后面的语句就不在执行了。
create procedure p16()
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 exit 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 ,exit 外 还有一种 undo handler,
continue 是触发后,后面的语句继续执行。
exit 是触发后,后面的语句不在执行,
undo 是触发后,前面的语句撤销,目前mysql 还不支持。
上面的 p16()还是存在问题的,因为表中可能不存在数据,就没办法去fetch 数据。
改进方案,P17()
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; // 这里还使用 continue
open getgoods;
// 在这里先fetch 一下,如果没有数据那么 repeat 就不会执行了
fetch getgoods into row_gid,row_num,row_name;
repeat
fetch getgoods into row_gid,row_num,row_name;
select row_num,row_name;
until you = 0 end repeat;
close getgoods;
end;