游标的使用可以概括为声明游标、打开游标、从游标中提取数据以及关闭游标,游标使用过程如图9.1所示。
图9.1 游标使用过程
1.声明游标
声明游标需要使用DECLARE语句,其语法格式如下:
DECLARE 游标名 CURSOR FOR SELECT语句
使用declare语句声明游标后,此时与该游标对应的select语句并没有执行,MySQL服务器内存中并不存在与select语句对应的结果集。
这个语句声明一个游标,也可以在子程序中声明多个游标,但是一个块中的每一个游标必须有唯一的名字。声明游标后也是单条操作的,但是不能用SELECT语句,不能有INTO子句。
2.打开游标
打开游标需要使用OPEN语句,其语法格式如下:
OPEN 游标名
使用OPEN语句打开游标后,与该游标对应的select语句将被执行,MySQL服务器内存中将存放与select语句对应的结果集。这个语句打开先前声明的游标。
3.从游标中提取数据
从游标中提取数据需要使用FETCH语句,其语法格式如下:
FETCH cursor_name INTO var_name [,var_name] ...
这个语句用指定的打开游标读取下一行(如果有下一行的话),并且前进游标指针。
4.关闭游标
关闭游标需要使用CLOSE语句,其语法格式如下:
CLOSE cursor_name
这个语句关闭先前打开的游标。游标如果没有被明确地关闭,游标将在它被声明的begin-end语句块的末尾关闭。
【例9.1】创建一个游标操作过程,用游标读取表中数据。
create procedure usecursor()
begin
declare aname varchar(20);
declare acj int;
declare cur_st cursor for(select sname,grade from student);
open cur_st;
fetch cur_st into aname,acj;
select aname,acj;
fetch cur_st into aname,acj;
select aname,acj;
fetch cur_st into aname,acj;
select aname,acj;
close cur_st;
end
执行结果如图9.2所示。
(www.xing528.com)
图9.2 创建游标的过程
call usecursor();
调用结果如图9.3所示。
图9.3 游标执行结果
用循环结构结合游标逐行显示记录的代码如下:
create procedure usecursor1()
begin
declare aname varchar(20);
declare acj int;
declare stop int default 0;
declare cur_st cursor for(select stname,cj from student);
declare CONTINUE HANDLER FOR SQLSTATE '02000' SET stop = null;
open cur_st;
fetch cur_st into aname,acj;
WHILE ( stop is not null) DO
select aname,acj;
fetch cur_st into aname,acj;
end while;
close cur_st;
end
执行结果如图9.4所示。
图9.4 创建带循环结构游标的过程
call usecursor1();
调用结果如图9.5所示。
图9.5 循环结构游标执行结果
分析语句:declare CONTINUE HANDLER FOR SQLSTATE '02000' SET stop=null;
/* mysql不知道用什么异常加入判断?这把游标异常捕捉后,并设置循环使用变量stop为null跳出循环*/
02000 主要代表的意思可以理解为:
发生下述异常之一:
(1)SELECT INTO语句或INSERT语句的子查询的结果为空表。
(2)在搜索UPDATE或DELETE语句内标识的行数为零。
(3)在FETCH 语句中引用的游标位置处于结果表最后一行之后。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。