MySql必知必会实战练习(六)游标
游标主要用于交互式应用,滚动屏幕上的数据,并对数据进行浏览或做出更改
看一下下面的例子:
drop procedure IF EXISTS processorders; create procedure processorders( out ordernum int ) begin select order_num from orders into ordernum; end; call processorders(@ordernum); select ordernum;
输出:
由于结果为多行无法显示,这时我们就需要使用游标来操作
1. 游标基本方法
(1)创建游标
create procedure processorders() begin declare ordernums cursor for select order_num from orders; end;
(2)打开游标
open ordernums;
(3)关闭游标
close ordernums;
在一个游标关闭后,如果没有重新打开,则不能使用它。
使用申明过的游标不需要再次声明,用open语句打开它就可以了。
2.游标使用示例
drop procedure IF EXISTS processorders; create procedure processorders( out numbers int, out custid int ) begin #声明游标 declare ordernums cursor for select order_num,cust_id from orders; #打开游标 open ordernums; #用来检索当前行的order_num(自动从第一行开始) fetch ordernums into numbers, custid; #关闭游标 close ordernums; end; call processorders(@numbers,@custid); select @numbers,@custid;
会看到只输出了第一行的order_num和cust_id:
继续,接下来将循环检索数据,从第一行到最后一行:
drop procedure IF EXISTS processorders; create procedure processorders( out numbers int, out custid int ) begin declare done boolean default 0; #声明游标 declare ordernums cursor for select order_num,cust_id from orders; #声明CONTINUE HANDLER declare CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; #打开游标 open ordernums; #开始循环 REPEAT #用来检索当前行的order_num(自动从第一行开始) fetch ordernums into numbers, custid; #.....这里可以对每次检索出来的数据进行处理 #结束循环 UNTIL done END REPEAT; #关闭游标 close ordernums; end; call processorders(@numbers,@custid); select @numbers,@custid;
我们会看出输出最后一行的order_num和cust_id
这样就实现了数据的循环检索,我们可以在 (#.....这里可以对每次检索出来的数据进行处理)注释处对每次检索出来的数据进行处理
注意:上面我们定义了一个COUNtINUE HANDLEr,它是在条件出现时执行的代码,它指出SQLSTATE '02000'出现时set done = 1,最开始SQLSTATE '02000'是一个未找到的条件,只有当repeat没有更多的行供循环时才会出现SQLSTATE '02000'