mysql 服务端提供只读的,单向游标,而且只能在存储过程中或触发器里或更底层的api中使用。因为mysql游标指向的对象都是存储在临时表中而不是实际查询到的数据,
1)所以mysql的游标是只读的,
2)在存储过程中,可以有多个游标,也可以嵌套地使用游标。
游标五步法:
一、声明一个游标: declare 游标名称 CURSOR for table;(这里的table可以是你查询出来的任意集合)
二、打开定义的游标:open 游标名称;
三、获得下一行数据:FETCH 游标名称 into testrangeid,versionid;
四、需要执行的语句(增删改查):这里视具体情况而定
五、释放游标:CLOSE 游标名称;
创建:
declare cursor_name Corsor [ LOCAL | GLOBAL] [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] [ TYPE_WARNING ]
更多请看这里;声明:遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。blog.csdn.net
案例:
read_loop:loop
--根据游标当前指向的一条数据
fetch cur into n,c;
--判断游标的循环是否结束
if done then
leave read_loop;
--跳出游标循环
endif;
--获取一条数据时,将count值进行累加操作,这里可以做任意你想做的操作,
set total = total + c;
--结束游标循环
endloop;
declare productcursor cursor scroll --第一步:声明游标
for
select * from productinfo where vendname='上海华测'
GO
open productcursor --第二步:打开游标
Go
--读取数据开始 --第三步:获取数据
fetch next from productcursor --读取当前行的下一行,并使其置为当前行(刚开始时游标置于表头的前一行,即若表是从0开始的,游标最初置于-1处,所以第一次读取的是头一行)
fetch prior from productcursor --读取当前行的前一行,并使其置为当前行
fetch first from productcursor --读取游标的第一行,并使其置为当前行(不能用于只进游标)
fetch last from productcursor --读取游标的最后一行,并使其置为当前行(不能用于只进游标)
fetch absolute 2 from productcursor --读取从游标头开始向后的第2行,并将读取的行作为新的行
fetch relative 3 from productcursor --读取从当前行开始向后的第3行,并将读取的行作为新的行
fetch relative-2 from productcursor --读取当前行的上两行,并将读取的行作为新的行
--读取数据结束
GO
close productcursor --第四步:关闭游标
Go
deallocate productcursor --第五步:删除游标
mysql 游标陷阱:
开销问题:
delimiter //
create PROCEDURE bad_cursor()
begin
declare admin_id INT;
declare f CURSOR for select admin_id from adv_admin;
open f;
fetch f into admin_id
close f;
end //
这个表有300条数据,我们 用show procedure status 查看
因为有300次读,300写 这些操作 都发生在打开游标的时候 open cur_sorname