本关任务: 销售数据库有工作人员、销售单数据表, 工作人员gzry数据表有雇员号gyh、姓名gyxm、出生日期csrq、学历xl、工资gz、部门bm、电话dh字段
销售单xsd数据表有销售单号xsdh、会员号hyh、雇员号gyh、销售日期xsrq、应付款yfk、实际付款sjfk字段
任务要求
建立存储过程 ygyj(in nf int,in yf int,in xm varchar(10) out pj varchar(10)) 输入年份nf和月份yf和姓名xm ,输出对该工作人员的评价pj。 若该员工在指定年份和月份的销售业绩(销售单xsd的实际付款sjfk的合计)大于等于10000元,则返回优秀,大于等于5000元,则返回达标,大于0小于5000元返回不达标,若没有销售单则返回无业绩。
调用过程 以2015、7和王雅静为参数,调用ygyj过程,将结果存入@yj1。 以2015、6和廖秉娴为参数,调用ygyj过程,将结果存入@yj2。 以2015、7和赵敏为参数,调用ygyj过程,将结果存入@yj3 。以2015、7和章伟为参数,调用ygyj过程,将结果存入@yj4。
相关知识
参数列表
([in|out|inout proc_name type][,in|out|inout proc_name type]) 过程可以没有参数或多个参数,多个参数之间用逗号分隔 IN输入参数,使数据可以传递给存储过程 OUT输出参数,用于需要返回结果 INOUT输入输出参数 既可以充当输入参数也可以充当输出参数
调用存储过程
CALL 存储过程(参数列表) 当有out参数时,可以用全局变量接收结果 全局变量以@开头,在mysql会话中一直有效
case多分支语句
CASE
WHEN <条件1> THEN <语句1>
WHEN <条件2> THEN <语句2>
……
[Else <其他语句>]
END CASE
这个代码改了两三个小时,最后发现是传参传错了,看 表里面的数据,再和自己的参数对比,不要擅自觉得是啥就传啥,要把数据和预期输出数据对比好,否则最容易出错了。
表里的日期是2015-07-12,我传入的日期是2015-7-xx,在计算机的世界里07!=7 记住了!!!
use sale;
#代码开始
delimiter $$
#定义过程
create procedure ygyj(in nf int,in yf int,in xm varchar(10),out pj varchar(10))
begin
declare n int;
set n=0;
select sum(sjfk) into n
from gzry join xsd on gzry.gyh=xsd.gyh
where gyxm=xm and DATE_FORMAT(xsrq,'%Y')=nf and DATE_FORMAT(xsrq,'%m')=yf;
case
when n>=10000 then set pj=concat('优秀');
when n>=5000 and n<10000 then set pj=concat('达标');
when n>=0 and n<5000 then set pj=concat('不达标');
else set pj=concat('无业绩');
end case;
end$$
delimiter ;
#调用过程
call ygyj(2015,07,'王雅静',@yj1);
call ygyj(2015,06,'廖秉娴',@yj2);
call ygyj(2015,07,'赵敏',@yj3);
call ygyj(2015,07,'章伟',@yj4);
#代码结束
select @yj1,@yj2,@yj3,@yj4;