游标描述:
游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。
游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条SQL 选择语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。游标实现了对mysql的存储过程中循环读取数据表中的对象的过程。
游标的特性:
- READ ONLY 只读,只能取值而不能赋值
- NOT SCROOLABLE 不可回滚,只能顺序读取
- ASENSITIVE 敏感,不能在已经打开游标的表上执行update事务
游标的操作:
- 声明游标: declare cursor_name cursor for select_statement
这个语句声明一个游标。也可以在子程序中定义多个游标,但是一个块中的每一个游标必须有唯一的名字。 - 打开游标: open cursor_name
- 游标fetch:fetch cursor_name into var_name , var_name2 ...
这个语句用指定的打开游标读取下一行(如果有下一行的话),并且前进游标指针。 - 关闭游标close: close cursor_name
这个语句关闭先前打开的游标。如果未被明确地关闭,游标在它被声明的复合语句的末尾被关闭。
游标的使用:
ex:
-- 创建存储过程cursorTest
create procedure cursorTest()
--使用复合语句
begin
-- 声明isdone变量并设置默认值为0
declare isdone int default 0;
declare id1,id2 int;
declare name char(5);
-- 声明游标
declare cur1 cursor for select id,name from user;
declare cur2 cursor for select id from user_temp;
declare continue handler for SQLSTATE 2000 set isdone =1;
-- 打开游标
open cur1;
open cur2;
-- 循环遍历
repeat
-- 获取游标内容
fetch cur1 into id1, name;
fetch cur2 into id2;
-- 条件语句判断
if not isdone then
if id1 < id2 then
insert into user_temp2 value(id1,name);
else
insert into user_temp2 values(id2,name);
end if;
end if;
until isdone end repeat;
--关闭游标
close cur1;
close cur2;
END;