游标可以用在存储过程 、函数 触发器或事件(Event)中。通俗讲是用来循环select的查询结果。游标需要与handler一起使用,并且要在handler之前定义。游标有三个属性。
Asensitive : 数据库也可以选择不复制结果集。
- Read only: 不可更新。
Nonscrollable: 游标只能向一个方向更新不能跳行。
使用过程分为 定义–打开–使用–关闭定义 : DECLARE cursor_name CURSOR for select_statement
- 打开 : open cursor_name
- 使用 : fetch cursor_name into var_name….
关闭 : close cursor_name
example
delimiter $$;
create procedure cur_demo()
begin
declare done int default 0;
declare _emp_no int;
declare _dept_no varchar(10);
declare cur1 cursor for select emp_no,dept_no from dept_emp;
declare continue handler for not found set done=1;
open cur1;
read_loop:LOOP
fetch cur1 into _emp_no,_dept_no;
IF done THEN
leave read_loop;
end if;
end LOOP;
close cur1;
end;
delimiter ;
需要注意的是从游标取得的数据放入变量时,变量的名字不能和游标定义中的列名一样,否则取出的值都为null。我们定义的是_emp_no,游标中的是emp_no。
游标的开销主要是因为需要对每行进行处理,处理过程越复杂,游标的效率越低
关于游标效率问题 下一节继续 to be continue…..