游标 Cursor
MySQL检索操作返回一组称为结果集的行 ,这组返回的行都是与SQL语句相匹配的行(零行或多行)。使用简单的SELECT语 句,例如,没有办法得到第一行、下一行或前10行,也不存在每次一行地处理所有行的简单方法(相对于成批地处理它们)。 有时,需要在检索出来的行中前进或后退一行或多行。这就是使用游标的原因。
游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或做出更改
使用游标
使用游标涉及几个明确的步骤。
- 在能够使用游标前,必须声明(定义)它。这个过程实际上没有检索数据,它只是定义要使用的SELECT语句。
- 一旦声明后,必须打开游标 open 以供使用。这个过程用前面定义的SELECT语句把数据实际检索出来。
- 对于填有数据的游标,根据需要取出(检索)各行。
- 在结束游标使用时,必须关闭游标 close
隐含关闭 如果你不明确关闭游标, MySQL将会在到达END语
句时自动关闭它。
游标只能用于存储过程 不像多数DBMS, MySQL游标只能用于存储过程(和函数)。
打开 游标
open cursor;
关闭游标
close cursor;
获得游标中的数据
fetch names_cursor into v_name;
示例:
-- 1. 查询出20部门所有员工的姓名
create PROCEDURE emp_names_pro() begin declare v_name varchar(100); declare v_count int; declare v_i int default 0; declare names_cursor cursor for select ename from emp where deptno=20; select count(empno) from emp where deptno=20 into v_count; open names_cursor; while v_i <= v_count do fetch names_cursor into v_name; insert into empNames values(v_name); set v_i = v_i +1; end while; close names_cursor; end; -- 调用存储过程 call emp_names_pro; drop PROCEDURE emp_names_pro; -- 把查询20部门到的员工的姓名 放在一张新表中 create table empNames(emp_name varchar(100));