游标主要用于交互式应用,滚动屏幕上的数据,并对数据进行浏览或作出更改fetch
看一下下面的例子:spa
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;
输出:code
因为结果为多行没法显示,这时咱们就须要使用游标来操做blog
(1)建立游标class
create procedure processorders() begin declare ordernums cursor for select order_num from orders; end;
(2)打开游标select
open ordernums;
(3)关闭游标循环
close ordernums;
在一个游标关闭后,若是没有从新打开,则不能使用它。sso
使用申明过的游标不须要再次声明,用open语句打开它就能够了。方法
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:im
继续,接下来将循环检索数据,从第一行到最后一行:
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'