【数据库——MySQL(实战项目1)】(3)图书借阅系统——存储函数

目录

  • 1. 简述
  • 2. 功能代码
    • 2.1 创建存储函数,根据图书编号查借阅人姓名,并调用该函数查询‘ **小邓在森林** ’已借未还的图书情况;
    • 2.2 创建存储函数,计算某借阅人还能借阅的图书数目,学生限额 `5` 本,教师限额 `10` 本。
    • 2.3 创建存储函数,查询某本图书逾期未还的时长,并调用该函数显示所有逾期未归还图书的书名,借阅人和逾期时长并按逾期时长排序;
    • 2.4 创建存储函数,查询某借阅人有几本逾期未还图书,并调用该函数显示有逾期未归还图书的借阅人和未归还图书数目;
    • 2.5 创建存储函数,利用游标计算计算某借阅人逾期未还图书应缴纳的罚款,逾期 `30` 日内罚款 `1` 元,逾期 `90` 日内罚款 `3` 元,逾期超过 `90` 日罚款 `5` 元。调用该函数显示所有应缴纳罚款的借阅人的姓名,逾期罚款和电话;

1. 简述

这篇文章将主要完成图书借阅系统的 4~8 题(存储函数),即:

  1. 创建存储函数,根据图书编号查借阅人姓名,并调用该函数查询‘ 小邓在森林 ’已借未还的图书情况;
  2. 创建存储函数,计算某借阅人还能借阅的图书数目,学生限额 5 本,教师限额 10 本。
  3. 创建存储函数,查询某本图书逾期未还的时长,并调用该函数显示所有逾期未归还图书的书名,借阅人和逾期时长并按逾期时长排序;
  4. 创建存储函数,查询某借阅人有几本逾期未还图书,并调用该函数显示有逾期未归还图书的借阅人和未归还图书数目;
  5. 创建存储函数,利用游标计算计算某借阅人逾期未还图书应缴纳的罚款,逾期 30 日内罚款 1 元,逾期 90 日内罚款 3 元,逾期超过 90 日罚款 5 元。调用该函数显示所有应缴纳罚款的借阅人的姓名,逾期罚款和电话;

2. 功能代码

:若读者并不是从第一篇文章一直到本篇文章执行代码的话(即中途退出了 Navicat),那么需要再次运行下述语句:

# 开启此权限才能创建存储函数(此权限在退出软件后会自动关闭)
set global log_bin_trust_function_creators=TRUE;

2.1 创建存储函数,根据图书编号查借阅人姓名,并调用该函数查询‘ 小邓在森林 ’已借未还的图书情况;

drop FUNCTION if exists f_bookid2borrowername;
delimiter $
create FUNCTION f_bookid2borrowername(bookid char(12))returns varchar(20) # 返回借阅人姓名
begindeclare borrowername varchar(20);select borrower.`name` into borrowernamefrom borrower join information on borrower.id = information.borroweridjoin book on book.id = information.bookidwhere book.id = bookid and information.returnDateReality IS NULL;return borrowername;
end$
delimiter ;

检测存储函数是否正确:

set @bookid = 101102512651;
select f_bookid2borrowername(@bookid) as 借阅人姓名;

测试结果如下:

在这里插入图片描述

调用该函数查询‘ 小邓在森林 ’已借未还的图书情况:

# 调用存储函数查询‘小邓在森林’已借未还的图书情况
select book.id as 图书编号, book.`name` as 书名, information.leadDate as 借出日期, information.returnDate as 应还日期, if(TO_DAYS(NOW()) - TO_DAYS(information.returnDate)>=0, TO_DAYS(NOW()) - TO_DAYS(information.returnDate), '未逾期') as '逾期时长(天)',borrower.id as 证件号, borrower.`name` as 姓名
from book join information on book.id = information.bookidjoin borrower on borrower.id = information.borrowerid
where f_bookid2borrowername(book.id) = '小邓在森林' and information.returnDateReality IS NULL;

在这里插入图片描述

:逾期时长是会每天自动增长的,因此读者运行的逾期时长结果可能和我的结果不同~

2.2 创建存储函数,计算某借阅人还能借阅的图书数目,学生限额 5 本,教师限额 10 本。

drop FUNCTION if exists f_ReBorrowTimes;
delimiter $
create FUNCTION f_ReBorrowTimes(borrowerid char(13))returns int # 返回还能借阅的图书数目
begindeclare ReBorrowTimes int;	# 还能借阅的图书数目declare Overdue int;				# 已借没还书籍的数量select COUNT(*) into Overduefrom borrower join information on borrower.id = information.borroweridjoin book on book.id = information.bookidwhere returnDateReality IS NULL and borrower.id = borrowerid;select if(borrower.category='教师',10 - Overdue, 5 - Overdue) into ReBorrowTimesfrom borrowerwhere borrower.id = borrowerid;return ReBorrowTimes;
end$
delimiter ;

检测存储函数是否正确:

在这里插入图片描述

# 教师(没有未还图书)
set @borrowerid = 1000000000001;
select f_ReBorrowTimes(@borrowerid) as 还能借阅的图书数目;
# 学生(已借未还3本书,只能再借2本书)
set @borrowerid = 2020312011047;
select f_ReBorrowTimes(@borrowerid) as 还能借阅的图书数目;

测试结果如下:

在这里插入图片描述

2.3 创建存储函数,查询某本图书逾期未还的时长,并调用该函数显示所有逾期未归还图书的书名,借阅人和逾期时长并按逾期时长排序;

drop FUNCTION if exists f_OverdueBook;
delimiter $
create FUNCTION f_OverdueBook(bookid char(12))returns int # 返回某本图书逾期未还的时长(天)
begindeclare OverdueTimes int;	# 图书逾期未还的时长(天)select TO_DAYS(NOW()) - TO_DAYS(information.returnDate) into OverdueTimesfrom book join information on book.id = information.bookidjoin borrower on borrower.id = information.borroweridWHERE book.id = bookid AND returnDateReality IS NULL AND TO_DAYS(NOW()) - TO_DAYS(information.returnDate) > 0;return OverdueTimes;
end$
delimiter ;

检测存储函数是否正确:【此部分检测代码待完成全部功能后再运行

# 逾期图书(即超过了30天未还的图书)
set @bookid = 101102512651;
select if(f_OverdueBook(@bookid) is null, '未逾期', f_OverdueBook(@bookid)) as '图书逾期未还的时长(天)';
# 未逾期图书(即未超过30天未还的图书)
# 先借一本书来测试未逾期图书
call p_InsertLeadInfo(2020312011047,101101699412);
set @bookid = 101101699412;
select if(f_OverdueBook(@bookid) is null, '未逾期', f_OverdueBook(@bookid)) as '图书逾期未还的时长(天)';
# 将图书归还
call p_UpdateLeadInfo(2020312011047,101101699412);
# 在架上图书(未借出图书)
set @bookid = 101101699410;
select if(f_OverdueBook(@bookid) is null, '未逾期', f_OverdueBook(@bookid)) as '图书逾期未还的时长(天)';

测试结果如下:

在这里插入图片描述

:图片虽然没显示还书过程,即 call p_UpdateLeadInfo(2020312011047,101101699412);,但是我另外自己执行了,所以读者就按照我给的代码执行即可,图片只是参考~

调用存储函数显示所有逾期未归还图书的书名,借阅人和逾期时长并按逾期时长排序

select book.`name` as 书名, borrower.id as 证件号, borrower.`name` as 姓名, f_OverdueBook(book.id) as 逾期天数
from book join information on book.id = information.bookidjoin borrower on borrower.id = information.borrowerid
WHERE f_OverdueBook(book.id) IS NOT NULL AND returnDateReality IS NULL
ORDER BY f_OverdueBook(book.id) desc;

在这里插入图片描述

2.4 创建存储函数,查询某借阅人有几本逾期未还图书,并调用该函数显示有逾期未归还图书的借阅人和未归还图书数目;

drop FUNCTION if exists f_OverdueBorrower;
delimiter $
create FUNCTION f_OverdueBorrower(borrowerid char(13))returns int # 返回某借阅人逾期未还图书数量
begindeclare OverdueCount int;	# 逾期未还图书数量select count(*) into OverdueCountfrom book join information on book.id = information.bookidjoin borrower on borrower.id = information.borroweridWHERE borrower.id = borrowerid AND returnDateReality IS NULL AND TO_DAYS(NOW()) - TO_DAYS(information.returnDate) > 0;return OverdueCount;
end$
delimiter ;

检测存储函数是否正确:【此部分检测代码待完成全部功能后再运行

# 教师(已借未还且逾期)
set @borrowerid = 1000000000002;
select f_OverdueBorrower(@borrowerid) as '逾期未还图书数(本)';
# 学生(已借未还未逾期)
# 先借一本书来测试未逾期图书
call p_InsertLeadInfo(2018210210205,101101699412);
set @borrowerid = 2018210210205;
select f_OverdueBorrower(@borrowerid) as '逾期未还图书数(本)';
# 将图书归还
call p_UpdateLeadInfo(2018210210205,101101699412);
# 学生(已借未还且逾期)
set @borrowerid = 2020312011047;
select f_OverdueBorrower(@borrowerid) as '逾期未还图书数(本)';
# 学生(未借过书)
set @borrowerid = 2023513266557;
select f_OverdueBorrower(@borrowerid) as '逾期未还图书数(本)';

测试结果如下:

在这里插入图片描述

调用存储函数显示有逾期未归还图书的借阅人和未归还图书数目

select borrower.id as 证件号, borrower.`name` as 姓名, f_OverdueBorrower(borrower.id) as 逾期未还图书数量
from book join information on book.id = information.bookidjoin borrower on borrower.id = information.borrowerid
WHERE f_OverdueBorrower(borrower.id) > 0
GROUP BY borrower.id;

在这里插入图片描述

2.5 创建存储函数,利用游标计算计算某借阅人逾期未还图书应缴纳的罚款,逾期 30 日内罚款 1 元,逾期 90 日内罚款 3 元,逾期超过 90 日罚款 5 元。调用该函数显示所有应缴纳罚款的借阅人的姓名,逾期罚款和电话;

drop FUNCTION if exists f_fine;
delimiter $
create FUNCTION f_fine(borrowerid char(13))returns int # 返回某借阅人逾期未还图书数量
begindeclare fine int DEFAULT(0);	# 逾期总罚款declare fine_per int default(0);	# 每本书罚款(临时)declare borrower_id char(13);	# 逾期借阅人证件号declare OverdueDay int;	# 逾期天数declare f int DEFAULT 1;# 设置游标declare c_finesum cursor forselect borrower.id, TO_DAYS(NOW()) - TO_DAYS(information.returnDate)from book join information on book.id = information.bookidjoin borrower on borrower.id = information.borroweridWHERE borrower.id = borrowerid AND returnDateReality IS NULL AND (TO_DAYS(NOW()) - TO_DAYS(information.returnDate)) > 0;# 错误处理declare continue handler for not foundset f = 0;open c_finesum;		# 打开游标while f = 1 dofetch c_finesum into borrower_id, OverdueDay;		# 读取游标if OverdueDay < 0 thenset fine_per = 0;elseif OverdueDay <= 30 thenset fine_per = 1;elseif OverdueDay <= 90 thenset fine_per = 3;elseif OverdueDay > 90 thenset fine_per = 5;end if;set fine = fine + fine_per;end while;close c_finesum;		# 关闭游标set fine = fine - fine_per;		# 由于continue会导致程序多运行一次,所以要减去最后一次扣多的钱!return fine;
end$
delimiter ;

检测存储函数是否正确:【此部分检测代码待完成全部功能后再运行

# 逾期3本书(5+5+5)
set @borrowerid = 2020312011047;
select f_fine(@borrowerid) as '应缴纳的罚款(元)';
# 逾期1本书(5)
set @borrowerid = 1000000000002;
select f_fine(@borrowerid) as '应缴纳的罚款(元)';
# 未逾期
# 先借一本书来测试未逾期图书
call p_InsertLeadInfo(2018210210205,101101699412);
set @borrowerid = 2018210210205;
select f_fine(@borrowerid) as '应缴纳的罚款(元)';
# 将图书归还
call p_UpdateLeadInfo(2018210210205,101101699412);

测试结果如下:

在这里插入图片描述

调用存储函数显示所有应缴纳罚款的借阅人的姓名,逾期罚款和电话(附加邮箱)

select borrower.id as 证件号, borrower.`name` as 姓名, f_fine(borrower.id) as '逾期罚款(元)', borrower.tel as 电话, borrower.email as 邮箱
from borrower
where f_fine(borrower.id) != 0;

在这里插入图片描述

:由于这里的逾期数据每本书都是大于 90 天的,所以都是 5 元往上加,读者可自行修改或者添加数据,来查看不同逾期的罚款情况~

上一篇文章:【数据库——MySQL(实战项目1)】(2)图书借阅系统——数据库测试、视图以及存储过程
下一篇文章:【数据库——MySQL(实战项目1)】(4)图书借阅系统——触发器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/105311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3 + Nodejs 实战 ,文件上传项目--实现文件批量上传(显示实时上传进度)

目录 技术栈 1.后端接口实现 2.前端实现 2.1 实现静态结构 2.2 整合上传文件的数据 2.3 实现一键上传文件 2.4 取消上传 博客主页&#xff1a;専心_前端,javascript,mysql-CSDN博客 系列专栏&#xff1a;vue3nodejs 实战--文件上传 前端代码仓库&#xff1a;jiangjunjie…

树莓派部署.net core网站程序

1、发布你的项目 使用mobaxterm上传程序 回到mobaxterm,f进入目录输入&#xff1a; cd webpublish 运行程序&#xff1a;dotnet WebApplication1.dll 访问地址为&#xff1a;http://localhost:5000,尝访问如下&#xff1a; 已经出现 返回的json&#xff0c;证明是可以访问的…

MyBatis的缓存,一级缓存,二级缓存

10、MyBatis的缓存 10.1、MyBatis的一级缓存 一级缓存是SqlSession级别的&#xff0c;通过同一个SqlSession对象 查询的结果数据会被缓存&#xff0c;下次执行相同的查询语句&#xff0c;就 会从缓存中&#xff08;缓存在内存里&#xff09;直接获取&#xff0c;不会重新访问…

软件架构设计(业务架构、应用架构、数据架构、技术架构)

一、架构相关概念 1、系统 系统&#xff1a;由一群有关联的个体组成&#xff0c;根据某种规则运作&#xff0c;能完成个别原件不能独立完成的工作的群体。大的系统可以嵌套小系统&#xff0c;被嵌套的小系统往往称为大系统的子系统。 2、模块 模块是从逻辑上将系统分解&#…

Java也能做OCR!SpringBoot 整合 Tess4J 实现图片文字识别

前言 今天给大家分享一个SpringBoot整合Tess4j库实现图片文字识别的小案例&#xff0c;希望xdm喜欢。 文末有案例代码的Git地址&#xff0c;可以自己下载了去玩玩儿或继续扩展也行。 话不多说&#xff0c;开整吧。 什么是Tess4j库 先简单给没听过的xdm解释下&#xff0c;这里要…

风储联合系统的仿真模型研究

摘要 风能是目前国内外应用较为广泛的一种绿色可再生能源&#xff0c;近几年我国风电产业的发展十分迅速。然后&#xff0c;越来越多的风力发电系统建并网&#xff0c;风力发电产生的电能受外界因素影响较大&#xff0c;具有一定的随机性和波动性&#xff0c;给并网后的电力系统…

铜死亡+机器学习+WGCNA+分型生信思路

今天给同学们分享一篇单基因泛癌免疫实验生信文章“IGF2BP3 overexpression predicts poor prognosis and correlates with immune infiltration in bladder cancer”&#xff0c;这篇文章于2023年2月3日发表在BMC Cancer期刊上&#xff0c;影响因子为3.8。 膀胱癌是全球最常见…

【环境】Ubuntu20.04 安装 Anaconda 顺顺利利

ubuntu里面安装的Anaconda也是顺顺利利 别忘了source source一下 参考链接 中间遇到了一个问题&#xff0c;用下面的链接轻松解决了 关于修改anaconda安装路径的问题

Stable Diffusion 动画SD-Animatediff V2

AI不仅可以生成令人惊叹的图片,还能给这些图片注入生命,让它们动起来。 这就是AnimateDiff要做的事情,一个神奇的工具,能将静态的AI生成图像转换成动画。 本次介绍基于SD如何实现这个神奇的方法。 文章目录 插件安装使用方法参数调整文生动图/视频Controlnet方法SD API方…

Java设计模式:Callback

介绍 回调&#xff08;Callback&#xff09;是一种设计模式&#xff0c;在这种模式中&#xff0c;一个可执行的代码被作为参数传递给其他代码&#xff0c;接收方的代码可以在适当的时候调用它。 在真实世界的例子中&#xff0c;当我们需要在任务完成时被通知时&#xff0c;我…

Ubuntu - 安装Docker

在Ubuntu上安装Docker分为以下几个步骤&#xff1a; 更新包列表&#xff1a; sudo apt update 安装依赖包&#xff0c;以便允许apt使用HTTPS&#xff1a; sudo apt install apt-transport-https ca-certificates curl software-properties-common 添加Docker官方GPG密钥&a…

Mybatis用Byte[]存图片,前端显示图片

前端页面 static下 也就是说byte[] 转成JSON字符串后,和用BASE64编码后是一摸一样的,那么SpringBoot会自动将实体类转JSON字符串,也就是说根本不需要Base64编码 注意:两个值并非一摸一样,一个多了个双引号 byte[]的值前后有个双引号 有一点点区别 一个有双引号,一个没有…

200、使用默认 Exchange 实现 P2P 消息 之 消息生产者(发送消息) 和 消息消费者(消费消息)

RabbitMQ 工作机制图&#xff1a; Connection&#xff1a; 代表客户端&#xff08;包括消息生产者和消费者&#xff09;与RabbitMQ之间的连接。 Channel&#xff1a; 连接内部的Channel。channel&#xff1a;通道 Exchange&#xff1a; 充当消息交换机的组件。 Queue&#xff…

UGUI交互组件ScrollView

一.ScrollView的结构 对象说明Scroll View挂有Scroll Rect组件的主体对象Viewport滚动显示区域&#xff0c;有Image和mask组件Content显示内容的父节点&#xff0c;只有个Rect Transform组件Scrollbar Horizontal水平滚动条Scrollbar Vertical垂直滚动条 二.Scroll Rect组件的属…

c# xml 参数读取读取的简单使用

完整使用之测试参数的读取&#xff08;xml&#xff09; 保存一个xml文档&#xff08;如果没有就会生成一个默认的 里面的参数用的是我们默认设置的&#xff09;&#xff0c;之后每次更改里面的某项&#xff0c;然后保存 类似于重新刷新一遍。 这里所用的xml测试参数前面需要加…

【TA 挖坑04】薄膜干涉 镭射材质 matcap

镭射材质&#xff0c;相对物理的实现&#xff1f; 万物皆可镭射&#xff0c;个性吸睛的材质渲染技术 - 知乎 (zhihu.com) 薄膜干涉材质&#xff0c;matcap更trick的方法&#xff1f;matcapremap&#xff0c; MatCap原理介绍及应用 - 知乎 (zhihu.com) 庄懂的某节课也做了mat…

echarts折线图(其他图也是一样)设置tooltip自动滚动

按顺序自动滚动效果 <div class"leftComp-charts" id"chartsBox"></div>chartsData: {roadNorm: [],time: []},eChartsTimer: nullinitChartsBox() {this.option {tooltip: {trigger: "axis",axisPointer: {// 方法一type: "s…

数据结构--》掌握数据结构中的查找算法

当你需要从大量数据中查找某个元素时&#xff0c;查找算法就变得非常重要。 无论你是初学者还是进阶者&#xff0c;本文将为你提供简单易懂、实用可行的知识点&#xff0c;帮助你更好地掌握查找在数据结构和算法中的重要性&#xff0c;进而提升算法解题的能力。接下来让我们开启…

【深度学习】深度学习实验二——前馈神经网络解决上述回归、二分类、多分类、激活函数、优化器、正则化、dropout、早停机制

一、实验内容 实验内容包含要进行什么实验&#xff0c;实验的目的是什么&#xff0c;实验用到的算法及其原理的简单介绍。 1.1 手动实现前馈神经网络解决上述回归、二分类、多分类问题 分析实验结果并绘制训练集和测试集的loss曲线。 原理介绍&#xff1a;回归问题使用的损失函…

在命令行下使用Apache Ant

Apache Ant的帮助文档 离线帮助文档 在<ant的安装目录>/manual下是离线帮助文档 双击index.html可以看到帮助文档的内容&#xff1a; 在线帮助文档 最新发布版本的帮助文档https://ant.apache.org/manual/index.html Apache Ant的命令 ant命令行格式 ant [opt…