一、光标的使用包括光标的声明、OPEN、FETCH和CLOSE四种
- 声明光标: DECLARE cursor_name CURSOR FOR select_statement;
- OPEN光标: OPEN cursor_name;
- FETCH光标:FETCH cursor_name INTO var_name [, var_name] …
- CLOSE光标: CLOSE cursor_name;
示例 初始化脚本
create table emp(
id int(11) not null auto_increment ,
name varchar(50) not null comment '姓名',
age int(11) comment '年龄',
salary int(11) comment '薪水',
primary key(`id`)
)engine=innodb default charset=utf8;
insert into emp(id,name,age,salary) values (null,'金毛狮王',55,3800),(null,'白眉鹰王',60,4000),(null,'青翼蝙蝠',38,2800),(null,'紫衫龙王',42,1800);
创建员工表并且插入员工信息 查询员工表 因为要逐行展示,所以创建存储过程时需要获取游标,而在获取之前需要先声明游标,使之用来存储查询员工表的结果集,然后开启游标并从游标中获取记录,获取几个就展示几个,获取结束后就关闭游标。 注意:声明的游标的名称是emp_result,corsor是它的数据类型,for是关键字,for后面跟的是select语句,即select * from emp; ( 当前游标里面封装的是 select * from emp; 语句查询的结果集),再抓取游标之前需先声明查询结果集的变量(e_id,e_name,e_age,e_salary),声明的这4个变量必须要和数据库表当中的那4个字段保持一致,抓取游标之后还需使用concat()函数使这几个变量输出出来 如果通过fetch这个关键字来一行一行抓取会很繁琐,因为我们也不知道游标当中到底包含多少条记录,而我们最好的方式就是通过循环结构,获取游标中的数据
循环获取游标
delimiter $
create procedure pro_test12()
begin
declare id int(11);
declare name varchar(50);
declare age int(11);
declare salary int(11);
declare has_data int default 1;
declare emp_result cursor for select * from emp;
declare exit handler for not found set has_data = 0;
open emp_result;
repeat
fetch emp_result into id , name , age , salary;
select concat('id为',id, ',name为',name, ',age为',age, ',薪水为:',salary);
until has_data = 0
end repeat;
close emp_result;
end$
注意:DECLARE EXIT HANDLER FOR NOT ROUND set has_data=0;这个需要声明在游标的下方,也就是需要它们紧挨着,声明的其他基本变量放在游标的上方 通过退出条件,声明了这样一个退出条件:当数据拿不到的时候会触发has_data,为has_data赋值为0并退出当前声明,has_data触发为0后也就退出了当前这个循环
|