实验4.5 第4关:修改多个数据表的存储过程

任务描述

本关任务: 图书管理数据库有读者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;

解题思路:

题目要求的是当条形码txmsh读者dzzhdzbh,看还书日期是否为null(不就说明当txm=sh and dzzh=dzbh select  hsrq 进行判断),若没有为空,说明有还书日期,没有借阅;若为空,则说明借走了,还没换,现在要还,把hsrq改为rq(更新表borrowwhere条件要加(改特指的那本书的hsrq),否则会把表中的所有hsrq都改了,where txm=sh and dzzh=dzbh and hsrq is null  最后这个条件最好也加上,防止表中有同一个人先后借同一本书两次),zk1(更新book中的zk,条件也要加txm=sh),输出还书成功。

要仔细阅读题目要求,和题目所限制的条件。而且要观察一下预期输出的形式,把select出来的形式与预期输出的形式比对好。

感觉存储过程和存储函数就是一个代码块,你先编写好程序,里面写着你要处理一件事的流程(针对不同的问题,有不同的代码解决方案,和写编程题差不多),调用它时直接传入参数,就可输出,而且这个代码块中有select语句,以及常用的sql语句

注意:

条形码虽然是数字但是涉及到字母了,所以还是字符型。

只要数据中含字母文字等不是数字的信息,此类型就是字符型,输入时要加单引号,

更新表数据时。如果不加where的话,更新数据就会将数据表中的所有信息都更改,所以要针对某本书更改信息的话,需要加where语句,将更新数据的目标细化1。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值