游标的简单使用
写在前面
游标的属性
- 无感知
- 只读:不可更新
- 不可遍历:只能在一个方面遍历数据,不能跳行
定义游标
declare cursor_name cursor for select_statement;
// 声明一个游标与select 语句相关联。使用select语句检索游标要遍历的行,再使用fetch提取。
// select检索的列数要和fetch中指定输出的列数匹配。
// 其中,select语句能有into子句。
游标的位置:
在定义变量之后,处理程序声明之前。
从游标中取值
FETCH [[NEXT] FROM] cursor_name INTO var_name [, var_name] ...
当游标读到末尾,继续取值会报错(02000),可以声明declare continue handler
来操作一越界标志。
语法格式为:
declare continue handler for NOT FOUND statement;
DECLARE … CONDITION声明
该语句声明一个命名错误的文件,将名称与特定的条件关联,可以在declare ... handler
中引用
通过此语句可以看到后端代码意图。
定义格式:
DECLARE no_such_table CONDITION FOR 1051;
DECLARE CONTINUE HANDLER FOR no_such_table
BEGIN
-- body of handler
END;
打开一个游标
open cursor_name;
定义一个简单的游标
- 准备数据
create table goods(gid int primary key auto_increment,name varchar(30) , num int);
insert into goods(name,num) values ("cat",40);
insert into goods(name,num) values ("dog",63);
insert into goods(name,num) values ("pig",87);
- 创建游标,将所有数据遍历
delimiter $$
create procedure test_pro1()
begin
-- 定义变量
declare row_gid int;
declare row_name varchar(30);
declare row_num int;
-- 创建游标
declare getcursor cursor for select * from goods;
-- open cursor;
open getcursor;
-- 从游标中取值
fetch getcursor into row_gid,row_name,row_num ;
-- 显示操作
select * from goods;
-- close
close getcursor;
end $$
delimiter ;
- 取多次值
delimiter $$
create procedure test_pro3()
begin
-- 定义变量
declare cnt int default 0;
declare i int default 0;
declare row_gid int ;
declare row_name varchar(20);
declare row_num int;
--定义游标,取出goods表的所有字段
declare getgoods cursor for select gid,name,num from goods;
-- 获取表行数
select count(*) into cnt from goods;
--打开游标
open getgoods;
--fetch取值
repeat
fetch getgoods into row_gid,row_name,row_num;
select row_name,row_num from goods;
set i:= i+1;
until i>=cnt end repeat;
--关闭游标
close getgoods;
end $$
delimiter ;
/*
result:
ERROR 1329 (02000): No data - zero rows fetched, selected, or processed
*/
- 使用越界标志来控制循环
delimiter $$
create procedure test_pro4()
begin
declare row_gid int ;
declare row_name varchar(20);
declare row_num int;
declare have int default 1;
declare getgoods cursor for select gid,name,num from goods;
// 先将have定为1,表示为true,当找不到行时设置为false并退出
declare continue handler for NOT FOUND set have:=0;
open getgoods;
repeat
fetch getgoods into row_gid,row_name,row_num;
select row_name,row_num from goods;
until have = 0 end repeat;
close getgoods;
end $$
delimiter ;
循环语法
- repeat语法
```sql
delimiter $$
create procedure test_pro4()
begin
declare row_gid int ;
declare row_name varchar(20);
declare row_num int;
declare have int default 1;
declare getgoods cursor for select gid,name,num from goods;
// 先将have定为1,表示为true,当找不到行时设置为false并退出
declare continue handler for NOT FOUND set have:=0;
open getgoods;
repeat
fetch getgoods into row_gid,row_name,row_num;
select row_name,row_num from goods;
until have = 0 end repeat;
close getgoods;
end $$
delimiter ;
- while 语法
delimiter $$
create procedure test_pro4()
begin
declare row_gid int ;
declare row_name varchar(20);
declare row_num int;
declare have int default 1;
declare getgoods cursor for select gid,name,num from goods;
// 先将have定为1,表示为true,当找不到行时设置为false并退出
declare continue handler for NOT FOUND set have:=0;
open getgoods;
while have = 1 do
fetch getgoods into row_gid,row_name,row_num;
select row_name,row_num from goods;
end while;
close getgoods;
end $$
delimiter ;