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;

  输出:

  MySql必知必会实战练习(六)游标

  由于结果为多行无法显示,这时我们就需要使用游标来操作

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:

MySql必知必会实战练习(六)游标

  继续,接下来将循环检索数据,从第一行到最后一行:

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

MySql必知必会实战练习(六)游标

  这样就实现了数据的循环检索,我们可以在 (#.....这里可以对每次检索出来的数据进行处理)注释处对每次检索出来的数据进行处理

  注意:上面我们定义了一个COUNtINUE HANDLEr,它是在条件出现时执行的代码,它指出SQLSTATE '02000'出现时set done = 1,最开始SQLSTATE '02000'是一个未找到的条件,只有当repeat没有更多的行供循环时才会出现SQLSTATE '02000'

上一篇:Apache报错信息之Invalid command 'Order', perhaps misspelled or defined by a module not included in the server config


下一篇:Android 添加源码到eclipse 以及相关设置