有一张表EMP(no,name,sex,salary) 给工资小于1000的每个女工工资上涨10%.
create table emp( id int not null auto_increment, name varchar(20), sex int, salary decimal(8,2), primary key(id) )engine=innoDB default charset=utf8;
实现一(sql版):
update emp set salary=salary*1.1 where sex=0 and salary<1000;
实现二(存储过程):
create procedure raisesalary() begin declare e_no int;
declare done boolean default 0;
declare e_salary decimal(8,2); declare findemp cursor for select id from emp where salary<1000 and sex=0;
DECLARE CONTINUE HANDLER FOR NOT FOUND set done=true ;
open findemp;
repeat
fetch findemp into e_no; select salary from emp where id=e_no into e_salary; if e_salary<1000 then update emp set salary=1.1*salary where id=e_no; end if;
until done end repeat;
end//
在存储过程中使用游标,注意以下几点:
1游标是用来获取记录集内单条数据,并可对数据实现滚动获取。
2declare的游标只是预编译的select不存在任何结果集,直至open才执行select;
3游标内记录获取,可用fetch cursorname into variable;可用通过repeat循环获取结果集的每一条记录。
4循环获取游标记录时,循环到最后一条记录会为null,需要定义异常处理(句柄?)continue handler for not find set done=true;为循环设置结束条件。
5delare存在顺序,先是局部变量---游标---句柄---过程体逻辑。
6结束循环,close cursorname;
实现三(存储过程二):