mysql 一

有一张表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;

 

 

实现三(存储过程二):

你可能感兴趣的:(sql,mysql)