【MySQL数据库】存储过程实战——图书借阅系统

news2024/9/24 17:17:42

图书借阅归还 借阅不用count判断,归还不用具体字段值判断 每次借阅或者归还只能操作1本

数据准备

-- 创建数据库
create database db_test3 CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 使用数据库
use db_test3;
-- 创建图书信息表:
create table books(
book_id int primary key auto_increment,
book_name varchar(50) not null,
book_author varchar(20) not null,
book_price decimal(10,2) not null,
book_stock int not null,
book_desc varchar(200)
);
-- 添加图书信息
insert into
books(book_name,book_author,book_price,book_stock,book_desc)
values('高级运维工程师','运老师',38.80,12,'运老师带你运维起飞');
insert into
books(book_name,book_author,book_price,book_stock,book_desc)
values('简易mysql','维老师',44.40,9,'维老师带你学mysql');
-- 创建学⽣信息表
create table students(
stu_num char(4) primary key,
stu_name varchar(20) not null,
stu_gender char(2) not null,
stu_age int not null
);
-- 添加学⽣信息
insert into students(stu_num,stu_name,stu_gender,stu_age)
values('1001','张三','男',20);
insert into students(stu_num,stu_name,stu_gender,stu_age)
values('1002','李四','⼥',20);
insert into students(stu_num,stu_name,stu_gender,stu_age)
values('1003','王五','男',20);

创建借书记录表

-- 借书记录表:
create table records(
rid int primary key auto_increment, -- 借阅信息id
snum char(4) not null,-- 学号
bid int not null, -- 书籍id
borrow_num int not null, -- 借阅数量
is_return int not null, -- 归还状态:0 表示未归还 1 表示已经归还
borrow_date date not null,-- 借阅日期
return_date date,-- 归还日期
constraint FK_RECORDS_STUDENTS foreign key(snum) references
students(stu_num),
constraint FK_RECORDS_BOOKS foreign key(bid) REFERENCES
books(book_id)
);

创建存储过程实现借书业务

-- 实现借书业务:
-- 参数1: a 输入参数 学号
-- 参数2: b 输入参数 图书编号
-- 参数3: state 输出参数 借书的状态(1 借书成功,2 学号不存在,3 图书不存在, 4 库存不⾜)
create procedure proc_borrow_book(IN a char(4),IN b int,OUT state int)
BEGIN
	DECLARE
		stu_exist INT DEFAULT 0;
	DECLARE
		book_exist INT DEFAULT 0;
	DECLARE
		stock INT DEFAULT 0;-- 判断学号是否存在:根据参数 a 到学⽣信息表查询是否有stu_num=a的记录
	SELECT
		stu_num INTO stu_exist 
	FROM
		students 
	WHERE
		stu_num = a;
	IF
		stu_exist > 0 THEN
-- 学号存在
-- 判断图书ID是否存在:根据参数b 查询图书记录总数
		SELECT
			book_id INTO book_exist 
		FROM
			books 
		WHERE
			book_id = b;
		IF book_exist > 0 THEN
-- 图书存在
-- 判断图书库存是否充足:查询当前图书库存,然后和参数m进行比较
	select book_stock INTO stock from books where book_id=b;
	if stock >= 1 then
-- 执行借书
-- 操作1:在借书记录表中添加记录
	insert into records(snum,bid,borrow_num,is_return,borrow_date) values(a,b,1,0,sysdate());
-- 操作2:修改图书库存
	update books set book_stock=stock-1 where book_id=b;
-- 借书成功
				SET state = 1;
				ELSE -- 库存不足
				SET state = 4;
			END IF;
			ELSE -- 图书不存在
			SET state = 3;
		END IF;
		ELSE -- 学号不存在
		SET state = 2;
	END IF;
END;-- 调用存储过程借书

SET @state = 0;
CALL proc_borrow_book ( '1001', 1, @state );
SELECT
					@state;

在这里插入图片描述
在这里插入图片描述

创建存储过程实现还书业务

-- 实现借书业务:
-- 参数1: a 输入参数 学号
-- 参数2: b 输入参数 图书编号
-- 参数3: dt 输入参数 借阅日期
-- 参数4: state 输出参数 归还的状态(1 归还成功 2 归还失败)
CREATE PROCEDURE proc_return_book ( IN a CHAR ( 4 ), IN b INT, IN dt DATE, OUT state INT ) BEGIN
	DECLARE
		record_count INT DEFAULT 0;-- 记录借阅记录id
	DECLARE
		record_id INT DEFAULT 0;-- 记录借阅记录id
-- 查询借阅记录id,如果借阅记录存在record_id的值会变为对应id,否则为0
	SELECT
		rid INTO record_id 
	FROM
		records 
	WHERE
		snum = a 
		AND bid = b 
		AND is_return = 0 
		AND borrow_date = dt;-- 查询借阅记录id,如果借阅记录存在record_id的值会变为对应id,否则为0
	SELECT
		count( rid ) INTO record_count 
	FROM
		records 
	WHERE
		snum = a 
		AND bid = b 
		AND is_return = 0 
		AND borrow_date = dt;
	IF
		record_count <> 0 THEN-- 修改书籍数量为添加借阅数量后的数量
			UPDATE books 
			SET book_stock = book_stock + 1 
		WHERE
			book_id = b;-- 修改借阅记录中的借阅状态为归还
		UPDATE records 
		SET is_return = 1 
		WHERE
			rid = record_id;-- 设置返回值为1,归还成功
		
		SET state = 1;
		ELSE -- 设置返回值为2,归还失败
		
		SET state = 2;
		
	END IF;
	
END;

SET @state = 0;
CALL proc_return_book ( '1001', 1, '2024-05-28', @state );
SELECT
	@state;

在这里插入图片描述

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

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

相关文章

C++容器之双端队列(std::deque)

目录 1 概述2 使用实例3 接口使用3.1 construct3.2 assigns3.3 iterators3.4 capacity3.5 rezize3.6 shrink_to_fit3.7 access3.8 assign3.9 push_back3.10 push_front3.11 pop_back3.12 pop_front3.13 insert3.14 erase3.15 swap3.16 clear3.17 emplace3.18 emplace_front3.19…

TCS工作原理

1、TCS的基本原理 TCS 的原理建立在驱动轮最优滑转率基础之上。理论研究证明&#xff0c;轮胎与路面之间的纵向附着特性决定汽车的加速和制动能力&#xff0c;轮胎滑动率与路面附着之间存在一定的关系&#xff0c;驱动轮的滑动率 λ \lambda λ 可以表示如下&#xff1a; λ…

SurfaceFinger layer创建过程

SurfaceFinger layer创建过程 引言 本篇博客重点分析app创建Surface时候&#xff0c;SurfaceFlinger是如何构建对应的Layer的主要工作有那些&#xff01; 这里参考的Android源码是Android 13 aosp&#xff01; app端创建Surface 其核心流程可以分为如下接部分: app使用w,h,fo…

使用nvm管理node多版本(安装、卸载nvm,配置环境变量,更换npm淘宝镜像)淘宝的镜像域名更换

最近 使用nvm 管理 node 的时候发现nvm install node版本号 总是失败。 nvm install 20.12.2Error retrieving "http://npm.taobao.org/mirrors/node/latest/SHASUMS256.txt": HTTP Status 404查看原因&#xff0c;因为淘宝的镜像域名更换&#xff0c;由于 npm.taob…

搜维尔科技:【系统集成案例】三面CAVE系统案例

用户名称&#xff1a;成都东软学院 主要产品&#xff1a;工业激光投影机、光学跟踪系统、主动立体眼镜、主动式立体眼镜发生器 在4米x9米的空间内&#xff0c;通过三通道立体成像&#xff0c;对立体模型进行数字化验证&#xff0c;辅助unity课程设计。 立体投影大屏方案采用的…

行波进位加法器和超前进位加法器比较

文章目录 1.行波进位加法器2.超前进位加法器 1.行波进位加法器 行波进位加法器就是将全加器串联起来&#xff0c;将低位的进位输出作为高位的进位输入。 由全加器公式可知&#xff1a; S A ⊕ B ⊕ C i n C o u t A B B C i n A C i n SA\oplus B\oplus C_{in}\\ C_{out}…

ssm教职工防疫打卡小程序-计算机毕业设计源码73760

摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;教职工防疫打卡小程序被用户普遍使用&#xff0c;为方便用…

QGIS:根据已知色带数组生成sld文件

1、将已知的色带数组转换为Excel文件&#xff08;Test.xlsx&#xff09; 格式如下&#xff1a; 2、Python生成QGIS colormap文件&#xff08;.txt&#xff09; import numpy as np import os import sys import pandas as pd#QGSI输入文件 #读取C中导出的Rainbow数组 fp_rain…

电商API接口||电商数据连接器:一键连接,效率加倍!

电商数据API接口&#xff1a; 一键连接&#xff0c;效率加倍&#xff01; 打造智能数据生态&#xff0c;让数据流动更加高效 在数字化时代&#xff0c;数据已成为企业发展的核心驱动力。电商API数据采集接口&#xff0c;助力电商企业实现数据的高效管理和应用。 电商数据API…

【乐吾乐3D可视化组态编辑器】模型类型与属性

编辑器地址&#xff1a;3D可视化组态 - 乐吾乐Le5le 本章主要为您介绍模型的属性功能。 一个模型至少会包含一个节点&#xff08;Node&#xff09;&#xff0c;从节点类型上可以分为转换节点&#xff08;TransformNode&#xff09;、网格&#xff08;Mesh&#xff09;、实例网…

【OpenGL手册-13】光源和颜色模型

文章目录 一、说明二、颜色综述三、灯光场景四、光源位置 一、说明 光源和颜色模型也是OpenGL的重要模型之一&#xff0c;我们将光源也看成是一个物体&#xff0c;这个物体特点是&#xff0c;不仅可以自己移动位置&#xff0c;而且要和其它物体颜色进行反射运算&#xff0c;从而…

应急响应-网页篡改-技术操作只指南

初步判断 网页篡改事件区别于其他安全事件地明显特点是&#xff1a;打开网页后会看到明显异常。 业务系统某部分出现异常字词 网页被篡改后&#xff0c;在业务系统某部分网页可能出现异常字词&#xff0c;例如&#xff0c;出现赌博、色情、某些违法APP推广内容等。2019年4月…

【一小时学会Charles抓包详细教程】初识Charles (1)

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 Charles介绍 …

1、pyton环境的安装-windows系统下

python官网 https://www.python.org/ 点击黄色的按钮&#xff0c;下载完成&#xff0c;如下&#xff1a; 双击安装&#xff0c;我现在以3.10.4版本进行安装说明&#xff1a; 一定要勾选上下边的to path&#xff0c;然后选择自定义安装 全选&#xff0c;点击next 选择要安装的路…

HTML大雪纷飞

目录 写在前面 HTML简介 完整代码 代码分析 运行结果 系列文章 写在后面 写在前面 小编又又又出现啦&#xff01;这次小编给大家带来大雪纷飞HTML版&#xff0c;不需要任何的环境&#xff0c;只要有一个浏览器&#xff0c;就可以随时随地下一场大雪哦&#xff01; HTM…

从金蝶云星空到旺店通·企业奇门通过接口配置打通数据

从金蝶云星空到旺店通企业奇门通过接口配置打通数据 对接系统金蝶云星空 金蝶K/3Cloud在总结百万家客户管理最佳实践的基础上&#xff0c;提供了标准的管理模式&#xff1b;通过标准的业务架构&#xff1a;多会计准则、多币别、多地点、多组织、多税制应用框架等&#xff0c;有…

QT:协议概述

文章目录 概念帧结构&#xff1a;通信流程 示例&#xff1a;请求帧&#xff1a;响应帧&#xff1a; 概念 帧结构&#xff1a; | SOF (1 byte) | Frame Length (1 byte) | Command (1 byte) | Data Field (N bytes) | Checksum (1 byte) | 通信流程 示例&#xff1a; 请求帧&a…

ld链接文件

文章目录 1. sections缩写2. 链接脚本2.1 MEMORY&#xff08;内存命令&#xff09;2.1.1 作用2.1.2 格式 2.2 SECTIONS&#xff08;段命令&#xff09;2.2.1 作用2.2.2 格式 2.3 特殊符号含义2.4 通配符2.5 Eg 1. sections缩写 2. 链接脚本 https://www.cnblogs.com/jianhua19…

如何处理 Google Chrome中的代理服务器错误?

如果您在 Google Chrome 浏览器中遇到代理服务器错误&#xff0c;您可以采取一些步骤来排除故障并解决问题。代理服务器充当您的设备和互联网之间的中介&#xff0c;与其相关的错误有时会破坏您的浏览体验。以下是帮助您解决该问题的一些步骤&#xff1a; 1. 检查您的互联网连接…

shell脚本编译成二进制文件shc

文章目录 1. 安装shc2. 使用shc编译Shell脚本3. 执行二进制文件4. 编译后执行效率 将Shell脚本转换为二进制执行文件&#xff0c;可以使用 shc工具。 shc是一个Shell编译器&#xff0c;它可以将Shell脚本编译成二进制文件。以下是详细步骤&#xff1a; 1. 安装shc 在大多数L…