任务描述
本关任务: 图书管理数据库有读者reader,图书book,借阅数据表,
读者表reader有读者证号dzzh、姓名xm、性别xb、身份sf、电话号码dhhm字段
图书表book有条形码txm、书名sm、分类号flh,作者zz,出版社cbs,出版日期cbrq,售价sj,典藏类别dclb,在库zk,币种bz字段
借阅表borrow有借阅编号jyid、读者证号dzzh、条形码txm、借阅日期jyrq、还书日期hsrq五个字段。
当读者借阅图书时,在借阅数据表中添加一条记录,还书日期设置为NULL,图书的在库zk字段被设置为0. 当读者归还图书时,将其对应借阅记录的还书日期设置为指定日期,并修改图书的在库zk字段为1.
任务要求
建立存储过程 hs(in sh varchar(8), in dzbh varchar(3) ,in rq date,out zt varchar(12) ) 输入图书条形码sh、读者证编号dzbh和还书日期rq,办理还书。 检查借阅数据表是否有此记录(条形码txm为sh读者dzzh为dzbh,且还书日期hsrq是否为null,若没有则zt返回"没有该借阅",否则在借阅表将该借阅记录的还书日期改为rq。 并将图书数据表该图书的在库zk改为1,zt返回"成功还书".
调用过程 分别以下列参数调用过程,并将结果返回@zt1、@zt2 书号P0000001和读者证号001,还书日期2022-5-1 书号P0000001和读者证号002,还书日期2022-5-1
use library;
#代码开始
delimiter $$
#定义过程
create procedure hs(in sh varchar(8), in dzbh varchar(3) ,in rq date,out zt varchar(12) )
begin
declare t date;
select hsrq into t
from borrow
where txm=sh and dzzh=dzbh; #( and hsrq=rq)如果加这个条件,选出来的t全部都是等于传入的rq的值,选不出来为null的时间,也就是说加这个条件的特指了书已经换了,表中信息已经有还书日期了,就不会没有还书的情况了,所以导致if语句没实行,就是因为 and hsrq=rq这个条件。
if t is not null then set zt = '没有该借阅';
else
set zt = '还书成功';
update book set zk=1 where txm=sh;
update borrow set hsrq=rq where txm=sh and dzzh=dzbh and hsrq is null;
end if;
end $$
delimiter ;
#调用过程
call hs('P0000001',001,2022-05-01,@zt1);
call hs('P0000001',002,2022-05-01,@zt2);
#代码结束
select @zt1,@zt2;
select txm,sm,zk from book;
select * from borrow;
解题思路:
题目要求的是当条形码txm为sh读者dzzh为dzbh,看还书日期是否为null(不就说明当txm=sh and dzzh=dzbh 时 select hsrq 进行判断),若没有为空,说明有还书日期,没有借阅;若为空,则说明借走了,还没换,现在要还,把hsrq改为rq(更新表borrow,where条件要加(改特指的那本书的hsrq),否则会把表中的所有hsrq都改了,where txm=sh and dzzh=dzbh and hsrq is null 最后这个条件最好也加上,防止表中有同一个人先后借同一本书两次),zk为1(更新book中的zk,条件也要加txm=sh),输出还书成功。
要仔细阅读题目要求,和题目所限制的条件。而且要观察一下预期输出的形式,把select出来的形式与预期输出的形式比对好。
感觉存储过程和存储函数就是一个代码块,你先编写好程序,里面写着你要处理一件事的流程(针对不同的问题,有不同的代码解决方案,和写编程题差不多),调用它时直接传入参数,就可输出,而且这个代码块中有select语句,以及常用的sql语句
注意:
条形码虽然是数字但是涉及到字母了,所以还是字符型。
只要数据中含字母文字等不是数字的信息,此类型就是字符型,输入时要加单引号,
更新表数据时。如果不加where的话,更新数据就会将数据表中的所有信息都更改,所以要针对某本书更改信息的话,需要加where语句,将更新数据的目标细化1。