当前位置: 首页 > news >正文

MySQL 带游标的存储过程(实验报告)

一、实验名称: 带游标的存储过程 

二、实验日期: 2024 年  5月 25 日

三、实验目的:

  • 掌握MySQL带游标的存储过程的创建及调用;

四、实验用的仪器和材料:

硬件:PC电脑一台;

配置:内存,2G及以上  硬盘250G及以上

软件环境:操作系统 windows7以上

数据库环境:MySQL5.7或MySQL8.0.20

五、实验步骤和方法

练习:(所有建表及插入数据语句参考附件,如下:)

# 实验前提:创建表并插入数据.记得跟MySQL交代好用哪个数据库CREATE TABLE `bookinfo` (`Bookid` varchar(30) NOT NULL,`ISBN` varchar(50) DEFAULT NULL,`Bookname` varchar(50) DEFAULT NULL,`Author` varchar(30) DEFAULT NULL,`Publisher` varchar(30) DEFAULT NULL,`Price` double DEFAULT NULL,`Booktype` varchar(20) DEFAULT NULL,`Orderdate` datetime DEFAULT NULL,`Bookstatus` varchar(50) DEFAULT NULL,PRIMARY KEY (`Bookid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `bookinfo` VALUES ('19-03-01-012024-8-1', '978-7-115-25547-1', '数据库系统原理及应用', '袁丽娜', '人民邮电出版社', '49', '专业基础', '2015-08-06 15:52:32', '在库');
INSERT INTO `bookinfo` VALUES ('19-03-01-012024-8-2', '978-7-302-54924-6', '网站设计与WEB应用开发技术', '张锦祥', '清华大学出版社', '76', '编程语言', '2020-04-10 15:55:13', '在库');
INSERT INTO `bookinfo` VALUES ('19-03-01-012024-8-7', '978-7-1116-5397-4', '数据库系统原理及应用', '胡孔法', '机械工业出版社', '45', '专业基础', '2020-06-16 16:16:13', '在库');
INSERT INTO `bookinfo` VALUES ('19-03-08-012024-8-5', '978-7-115-37950-4', '数据结构', '严蔚敏', '人民邮电出版社', '35', '编程语言', '2016-08-16 15:58:46', '在库');
INSERT INTO `bookinfo` VALUES ('19-03-08-012024-8-6', '978-7-121-24492-6', '数据仓库与数据挖掘实践', '李春葆', '电子工业出版社', '48', '实践类', '2014-11-06 15:56:54', '借出');CREATE TABLE `booklended` (`Bookid` varchar(30) NOT NULL,`Readerid` char(10) NOT NULL,`Lendtime` datetime NOT NULL,`Backtime` datetime DEFAULT NULL,PRIMARY KEY (`Bookid`,`Readerid`,`Lendtime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `booklended` VALUES ('19-03-01-012024-8-1', '1000002113', '2019-12-08 16:07:23', null);
INSERT INTO `booklended` VALUES ('19-03-01-012024-8-2', '1000001112', '2020-09-11 18:29:06', '2020-12-02 18:29:17');
INSERT INTO `booklended` VALUES ('19-03-08-012024-8-5', '1000001111', '2020-09-08 16:37:02', null);
INSERT INTO `booklended` VALUES ('19-03-08-012024-8-6', '1000001114', '2020-01-01 16:07:23', '2020-02-06 20:02:45');CREATE TABLE `reader` (`Readerid` char(10) NOT NULL,`Readername` varchar(15) DEFAULT NULL,`Tel` varchar(11) DEFAULT NULL,`Sf` varchar(4) DEFAULT NULL,`Sno` varchar(10) DEFAULT NULL,`Num` int DEFAULT NULL,`Sex` char(2) DEFAULT NULL,`Birth` datetime DEFAULT NULL,`Dept` varchar(50) DEFAULT NULL,`bz` varchar(20) DEFAULT NULL,PRIMARY KEY (`Readerid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `reader` VALUES ('1000001111', '李庆', '13785696235', '学生', '1904112234', '2', '男', '2001-06-16 00:00:00', '网络系', null);
INSERT INTO `reader` VALUES ('1000001112', '陈晨', '13825263695', '学生', '1804123695', '3', '男', '2000-07-21 16:02:31', '软件工程系', null);
INSERT INTO `reader` VALUES ('1000001114', '刘柳', '13623659465', '学生', '1704133695', '1', '女', '1999-12-16 16:05:05', '数码系', null);
INSERT INTO `reader` VALUES ('1000002113', '王建', '13925063698', '教师', null, '5', '男', '1983-03-10 16:03:33', '软件工程系', null);

1、创建一个带游标的存储过程p_find,不带参数,查询出“人民邮电出版社”出版书籍数据库相关的所有信息(包括借阅书籍编号,借阅书籍名称,读者编号,读者姓名,书籍借出时间,书籍归还时间,当前日期和时间),并且将查询出的所有数据插入到读者借阅备份表brl_bak中。brl_bak表建表语句如下,写出该存储过程及调用此存储过程的代码,并查询表brl_bak中的数据进行验证。  

  CREATE TABLE brl_bak(Bookid varchar(30),Bookname varchar(50),readerid varchar(10),readname varchar(15),ltime datetime,btime datetime,crsj datetime) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2、创建一个带游标的存储过程p_cfind,带参数,实现根据传入参数(读者所在部门)查询出“软件工程系”的学生和老师借阅的所有信息(包括借阅书籍编号,借阅书籍名称,读者编号,读者姓名,书籍借出时间,书籍归还时间,当前日期和时间),并且将查询出的所有数据插入到读者借阅备份表brl_bak1中。brl_bak1表建表语句如下,写出该存储过程及调用此存储过程的代码,并查询表brl_bak中的数据进行验证。   

 CREATE TABLE brl_bak1(Bookid varchar(30),Bookname varchar(50),readerid varchar(10),readname varchar(15),ltime datetime,btime datetime,crsj datetime) ENGINE=InnoDB DEFAULT CHARSET=utf8;

六、实验结果或结论:即根据实验过程中所见到的现象和测得的数据,作出结论。

根据实验要求创建一个带游标的存储过程p_find:

DELIMITER //CREATE PROCEDURE p_find()
BEGINDECLARE done INT DEFAULT 0;DECLARE book_id varchar(30);DECLARE book_name varchar(50);DECLARE reader_id char(10);DECLARE reader_name varchar(15);DECLARE borrow_time datetime;DECLARE return_time datetime;DECLARE current_datetime datetime;DECLARE cur CURSOR FORSELECT bi.Bookid, bi.Bookname, bl.Readerid, r.Readername, bl.Lendtime, bl.BacktimeFROM bookinfo bi   -- 为了方便给这三个表都起了别名JOIN booklended bl ON bi.Bookid = bl.BookidJOIN reader r ON bl.Readerid = r.ReaderidWHERE bi.Publisher = '人民邮电出版社';DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;OPEN cur;read_loop: LOOPFETCH cur INTO book_id, book_name, reader_id, reader_name, borrow_time, return_time;IF done THENLEAVE read_loop;END IF;SET current_datetime = NOW();INSERT INTO brl_bak(Bookid, Bookname, readerid, readname, ltime, btime, crsj)VALUES (book_id, book_name, reader_id, reader_name, borrow_time, return_time, current_datetime);END LOOP;CLOSE cur;
END//DELIMITER ;

查询读者借阅备份表brl_bak:

根据实验要求创建一个带游标的存储过程p_cfind

DELIMITER //CREATE PROCEDURE p_cfind(IN dept_name VARCHAR(50))
BEGINDECLARE done INT DEFAULT 0;DECLARE book_id varchar(30);DECLARE book_name varchar(50);DECLARE reader_id varchar(10);DECLARE reader_name varchar(15);DECLARE borrow_time datetime;DECLARE return_time datetime;DECLARE current_datetime datetime;DECLARE cur CURSOR FORSELECT bi.Bookid, bi.Bookname, bl.Readerid, r.Readername, bl.Lendtime, bl.BacktimeFROM bookinfo biJOIN booklended bl ON bi.Bookid = bl.BookidJOIN reader r ON bl.Readerid = r.ReaderidWHERE r.Dept = dept_name;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;OPEN cur;read_loop: LOOPFETCH cur INTO book_id, book_name, reader_id, reader_name, borrow_time, return_time;IF done THENLEAVE read_loop;END IF;SET current_datetime = NOW();INSERT INTO brl_bak1(Bookid, Bookname, readerid, readname, ltime, btime, crsj)VALUES (book_id, book_name, reader_id, reader_name, borrow_time, return_time, current_datetime);END LOOP;CLOSE cur;
END//DELIMITER ;

查询读者借阅备份表brl_bak1:

实验心得可写上实验成功或失败的原因,实验后的心得体会、建议等。

    带游标的存储过程在实践中通常用于处理需要逐行操作结果集的情况。游标允许逐行检索查询结果,并对每一行进行处理,这在某些复杂的数据处理场景中非常有用。在以后实践过程中使用带游标的存储过程时需要注意的事项,首先是性能影响,使用游标会增加数据库服务器的负载,尤其是在处理大量数据时。游标需要占用额外的内存和处理时间,因此在设计存储过程时要考虑性能方面的影响。第二个需要注意的点是数据一致性,在使用游标时,需要确保正确处理每一行数据,以避免数据不一致或错误的结果。正确地打开、关闭和释放游标是确保数据一致性的重要步骤。最后便是资源管理——游标使用数据库连接和内存资源,因此在使用游标时要注意资源的管理和释放,避免资源泄漏或性能下降。

    结合上面的实验,使用带游标的存储过程p_cfind可以逐行查询“软件工程系”学生和老师借阅的所有信息,并将数据插入到读者借阅备份表brl_bak1中。这种做法的好处之一便是精细控制:使用游标可以实现对每一行数据的精细控制和处理,适用于需要逐行处理的复杂业务逻辑。同时也增加了灵活性,游标允许在存储过程中对结果集进行动态操作,可以根据需要对数据进行个性化处理。另外起到了数据备份的作用:将查询结果插入到备份表中可以实现数据备份和保留历史记录,有助于数据管理和数据分析。

    带游标的存储过程在处理需要逐行操作数据的场景中非常有用,但在设计和实现时需要注意性能、数据一致性和资源管理等方面的问题,以确保存储过程的效率和稳定性。

相关文章:

MySQL 带游标的存储过程(实验报告)

一、实验名称: 带游标的存储过程 二、实验日期: 2024 年 5月 25 日 三、实验目的: 掌握MySQL带游标的存储过程的创建及调用; 四、实验用的仪器和材料: 硬件:PC电脑一台; 配置&#xff1…...

结构体(位段)内存分配

结构体由多个数据类型的成员组成。那编译器分配的内存是不是所有成员的字节数总和呢? 首先,stu的内存大小并不为29个字节,即证明结构体内存不是所有成员的字节数和。   其次,stu成员中sex的内存位置不在21,即可推测…...

基于SSH的母婴用品销售管理系统带万字文档

文章目录 母婴商城系统一、项目演示二、项目介绍三、系统部分功能截图四、万字论文参考五、部分代码展示六、底部获取项目源码和万字论文参考(9.9¥带走) 母婴商城系统 一、项目演示 母婴商城系统 二、项目介绍 基于SSH的母婴商城系统 系统…...

说些什么好呢

大一:提前学C和C。学完语法去洛谷或者Acwing二选一,刷300道左右题目。主要培养编程思维,让自己的逻辑能够通过代码实现出来。 现在对算法有点感兴趣但是没有天赋,打不了acm,为就业做准备咯。 大二(算法竞赛)&#xff1…...

1301-习题1-1高等数学

1. 求下列函数的自然定义域 自然定义域就是使函数有意义的定义域。 常见自然定义域: 开根号 x \sqrt x x ​: x ≥ 0 x \ge 0 x≥0自变量为分式的分母 1 x \frac{1}{x} x1​: x ≠ 0 x \ne 0 x0三角函数 tan ⁡ x cot ⁡ x \tan x \cot x …...

C语言之指针进阶(3),函数指针

目录 前言: 一、函数指针变量的概念 二、函数指针变量的创建 三、函数指针变量的使用 四、两段特殊代码的理解 五、typedef 六、函数指针数组 总结: 前言: 本文主要讲述C语言指针中的函数指针,包括函数指针变量的概念、创建…...

RabbitMQ安装及配套Laravel使用

MQ MQ 全称 Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于系统之间的异步通信。 为什么需要mq: 解耦:MQ能够使各个系统或组件之间解耦,降低它们之间的耦合度,提高系统的灵活性和可维护性异步处理:通过MQ可以实现异步处理,提高系统响应速度和吞…...

java在类的定义中创建自己的对象?

当在main方法中新建自身所在类的对象,并调用main方法时,会不断循环调用main方法,直到栈溢出 package com.keywordStudy;public class mainTest {static int value 33;public static void main(String[] args) throws Exception{String[] sn…...

掌握C++回调:按值捕获、按引用捕获与弱引用

文章目录 一、按引用捕获和按值捕获1.1 原理1.2 案例 二、弱引用2.1 原理2.2 案例一2.3 案例二:使用base库的弱引用 三、总结 在C回调中,当使用Lambda表达式捕获外部变量时,有两种捕获方式:按值捕获和按引用捕获。 一、按引用捕获…...

抖音运营_如何做出优质的短视频

目录 一 短视频内容的构成 1 图像 2 字幕 3 声音 4 特效 5 描述 6 评论 二 短视频的热门类型 1 颜值圈粉类 2 知识教学类 3 幽默搞笑类 4 商品展示类 5 才艺技能类 6 评论解说类 三 热门短视频的特征 1 产生共鸣 2 正能量 3 紧跟热点话题 4 富有创意 四 短视…...

Day21:Leetcode513.找树左下角的值 +112. 路径总和 113.路径总和ii + 106.从中序与后序遍历序列构造二叉树

LeetCode:513.找树左下角的值 解决方案: 1.思路 在遍历一个节点时,需要先把它的非空右子节点放入队列,然后再把它的非空左子节点放入队列,这样才能保证从右到左遍历每一层的节点。广度优先搜索所遍历的最后一个节点…...

Java数据结构和算法(B树)

前言 B树又叫平衡的多路搜索树;平衡的意思是又满足平衡二叉树的一些性质,左树大于右树; 多路意思是,可以多个结点,不再是像二叉树只有两个结点; 实现原理 B树是一种自平衡的搜索树,通常用于实…...

成为程序员后我都明白了什么?从入行到弃坑?

作为一个入行近10年的php程序员,真心感觉一切都才刚开始,对计算机,编程语言的理解也好,程序员中年危机也罢,之前都是听别人说的,真的自己到了这个水平,这个年龄才深刻体会到这其中的种种。 我一…...

python --创建固定字符串长度,先进先出

a 123def concatenate_within_limit(b, new_string):# 计算新字符串与a的长度之和a btotal_length len(a) len(new_string)# 如果长度超过1024,从前面删除足够的字符if total_length > 5:diff total_length - 5a a[diff:] new_string # 删除前diff个字符…...

容器化部署

目录 docker容器化部署 怎样使用Docker Compose或Kubernetes等容器编排工具来管理和扩展联邦学习系统 使用Docker Compose...

国产数据库TiDB的常用方法

TiDB的常用方法主要涉及安装配置、数据操作、性能调优以及监控和维护等方面。以下是对这些常用方法的归纳和介绍: 1. 安装与配置 安装TiDB:根据官方文档的指引,用户可以按照步骤进行TiDB的安装。配置TiDB:安装完成后&#xff0c…...

基于DdddOcr通用验证码离线本地识别SDK搭建个人云打码接口Api

前言 最近介绍了一款免费的验证码识别网站,识别效率太低,考虑到ddddocr是开源的,决定搭建搭建一个,发现原作者sml2h3已经推出好久了,但是网上没有宝塔安装的教程,于是本次通过宝塔搭建属于自己的带带弟弟OCR通用验证码离线本地识别 原项目地址:https://github.com/sml2…...

2、xss-labs之level2

1、打开页面 2、传入xss代码 payload&#xff1a;<script>alert(xss)</script>&#xff0c;发现返回<script>alert(xss)</script> 3、分析原因 打开f12&#xff0c;没什么发现 看后端源码&#xff0c;在这form表单通过get获取keyword的值赋给$str&am…...

人才测评的应用:人才选拔,岗位晋升,面试招聘测评

人才测评自诞生以来&#xff0c;就被广泛应用在各大方面&#xff0c;不仅是我们熟悉的招聘上&#xff0c;还有其他考核和晋升&#xff0c;都会需要用到人才测评。不知道怎么招聘&#xff1f;或者不懂得如何实现人才晋升&#xff1f;都可以参考人才测评&#xff0c;利用它帮我们…...

前端面试题日常练-day33 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末。 在jQuery中&#xff0c;以下哪个选项用于在元素上绑定一个点击事件&#xff1f; a) click() b) bind() c) on() d) trigger() jQuery中&#xff0c;以下哪个选项用于获取元素的属性值&#xff1f; …...

存储那么贵,何不白嫖飞书云文件空间荷

基础示例&#xff1a;单工作表 Excel 转 TXT 以下是将一个 Excel 文件中的第一个工作表转换为 TXT 的完整步骤&#xff1a; 1. 加载并读取Excel文件 from spire.xls import * from spire.xls.common import * workbook Workbook() workbook.LoadFromFile("示例.xlsx"…...

彻底搞懂Pinecone、Chroma、Weaviate:向量数据库架构拆解,看这篇就够了!

向量数据库存储 Embedding&#xff0c;也就是文本、图像或音频的数值表示&#xff0c;并在查询时检索语义上最接近的结果。RAG 系统正是基于这一机制运作。本文对比三个主流方案&#xff0c;每个都附有 Python 代码&#xff0c;均来自实际在生产环境中使用三者的经验。 三种选择…...

进程与线程的核心区别:一篇看懂,告别混淆

在编程学习中&#xff0c;尤其是接触 C 多线程、操作系统相关知识时&#xff0c;进程&#xff08;Process&#xff09;和线程&#xff08;Thread&#xff09;是两个绕不开的概念。很多新手会把二者混为一谈&#xff0c;甚至像之前我被问到的那样&#xff0c;疑惑“进程是不是线…...

使用Knockout.js构建完全键盘友好的无障碍导航菜单:终极指南

使用Knockout.js构建完全键盘友好的无障碍导航菜单&#xff1a;终极指南 【免费下载链接】knockout Knockout makes it easier to create rich, responsive UIs with JavaScript 项目地址: https://gitcode.com/gh_mirrors/kn/knockout 在现代Web开发中&#xff0c;创建…...

SDMatte镜像CI/CD实践:GitOps驱动的模型更新与服务发布

SDMatte镜像CI/CD实践&#xff1a;GitOps驱动的模型更新与服务发布 1. 项目背景与价值 SDMatte是一款面向高质量图像抠图的AI模型&#xff0c;特别擅长处理复杂边缘和半透明物体的提取任务。在电商、设计、内容创作等领域&#xff0c;快速高效的图像抠图能力可以显著提升工作…...

周测复盘【前缀和and差分】

其实存了三个草稿没发&#xff0c;因为题解半路解不出来了。 花了四十分钟搞三个平台关联&#xff0c;最后一道题还是没来得及交上哈哈&#xff0c;OK直接进入正题 题目A Atcoder Trifecta 题目翻译&#xff1a; 编号为1到N的N匹马进行了一场比赛 所有马匹同时起跑&#x…...

Springboot 实现多数据源(PostgreSQL 和 SQL Server)连接父

一、环境准备 Free Spire.Doc for Python 是免费 Python 文档处理库&#xff0c;无需依赖 Microsoft Word&#xff0c;支持 Word 文档的创建、编辑、转换等操作&#xff0c;其中内置的 Markdown 解析能力&#xff0c;能高效实现 Markdown 到 Doc/Docx 格式的转换&#xff0c;且…...

Hugging Face分词超快

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 高效分词引擎&#xff1a;NLP处理速度的革命性突破目录高效分词引擎&#xff1a;NLP处理速度的革命性突破 引言&#xff1a;分词…...

002、Python开发环境搭建:从官网下载到安装完成

002、Python开发环境搭建&#xff1a;从官网下载到安装完成 昨天帮实习生调试一个简单的脚本&#xff0c;他信誓旦旦说环境肯定没问题&#xff0c;结果一跑就报“python不是内部或外部命令”。我让他打开命令行输入where python&#xff0c;果然空空如也——环境变量都没配。这…...

剑指offer-61、序列化二叉树

请实现两个函数&#xff0c;分别⽤来序列化和反序列化⼆叉树⼆叉树的序列化是指&#xff1a;把⼀棵⼆叉树按照某种遍历⽅式的结果以某种格式保存为字符串&#xff0c;从⽽使得内存中建⽴起来的⼆叉树可以持久保存。序列化可以基于先序、中序、后序、层序的⼆叉树遍历⽅式来进⾏…...