数据库实验10
设计性实验
1.实验要求
1.编写函数FsumXXX,1~n(参数)求和;
GO
CREATE FUNCTION Fsum065 (@n INT)
RETURNS INT
AS
BEGIN
DECLARE @sum INT = 0
WHILE @n > 0
BEGIN
SET @sum = @sum + @n
SET @n = @n - 1
END
RETURN @sum
END
GO
– 调用
SELECT DBO.Fsum065(100) AS TotalSum;
2.编写函数FRANKXXX,参数为学号,返回该生平均分班级排名;
– 调用
SELECT DBO.Fsum065(100) AS TotalSum;
GO
CREATE FUNCTION FRANK065 (@sno CHAR(3))
RETURNS INT
AS
BEGIN
DECLARE @rank INT
SELECT @rank = rnk
FROM (SELECT Sno, RANK() OVER (ORDER BY AVG(Degree) DESC) AS rnkFROM Score065GROUP BY Sno
) AS RankedStudents
WHERE Sno = @snoRETURN @rank
END
GO
– 调用
SELECT DBO.FRANK065(‘S001’) AS Rank;
3.编写函数FCJAXXX,参数为姓名或姓名一部分,返回该生的所有课程的成绩(学号,姓名,课程名,成绩等级);
选修成绩等级 A:90~100 B:80~90 C: 70~80 D:60~70 E:<60
GO
CREATE FUNCTION FCJA065 (@name NVARCHAR(10))
RETURNS TABLE
AS
RETURN (
SELECT
S.Sno,
S.Sname,
C.Cname,
SC.Degree,
CASE
WHEN SC.Degree < 60 THEN ‘E’
WHEN SC.Degree BETWEEN 60 AND 69 THEN ‘D’
WHEN SC.Degree BETWEEN 70 AND 79 THEN ‘C’
WHEN SC.Degree BETWEEN 80 AND 89 THEN ‘B’
WHEN SC.Degree BETWEEN 90 AND 100 THEN ‘A’
END AS GradeLevel
FROM student065 S
JOIN Score065 SC ON S.Sno = SC.Sno
JOIN Course065 C ON SC.Cno = C.Cno
WHERE S.Sname LIKE ‘%’ + @name + ‘%’
)
GO
– 调用
SELECT * FROM DBO.FCJA065(‘曾华庆’);
4.编写函数FclassXXX,参数为班级,返回该班男、女生平均分前二名 (学号,姓名,课程名,成绩,平均)
GO
CREATE FUNCTION Fclass065 (@classname CHAR(5))
RETURNS TABLE
AS
RETURN (
SELECT *
FROM (
SELECT
S.Sno,
S.Sname,
C.Cname,
SC.Degree,
AVG(SC.Degree) OVER(PARTITION BY S.Sno) AS AvgScore,
ROW_NUMBER() OVER(PARTITION BY S.Ssex ORDER BY AVG(SC.Degree) DESC) AS rn
FROM student065 S
JOIN Score065 SC ON S.Sno = SC.Sno
JOIN Course065 C ON SC.Cno = C.Cno
WHERE S.Class = @classname
GROUP BY S.Sno, S.Sname, S.Ssex, C.Cname, SC.Degree
) AS Ranked
WHERE rn <= 2
)
GO
– 调用
SELECT * FROM DBO.Fclass065(‘软件工程1班’);
- 修改表courseXXX ,增加两列,课程选修最大人数(mn ,默认50)和当前人数(cn ,默认0);
ALTER TABLE Course065 ADD mn INT DEFAULT 50, cn INT DEFAULT 0;
6.选课存储过程csXXX:
–某学生没有选过某课程,要选某课程时,当没有超过课程最大人数时,可以选择该课程,当前选课人数加1, 并在成绩score表中增加对应的该生该课程的成绩为0记录
–否则,提示该课程选课人数已满!
EXEC csXXX 学号 , 课程号
– 调用
SELECT * FROM DBO.Fclass065(‘软件工程1班’);
ALTER TABLE Course065
ADD mn INT DEFAULT 50,
cn INT DEFAULT 0;
GO
CREATE PROCEDURE cs065 @sno CHAR(3), @cno CHAR(5)
AS
BEGIN
IF EXISTS (SELECT 1 FROM Score065 WHERE Sno = @sno AND Cno = @cno)
BEGIN
PRINT ‘该学生已选修此课程’
RETURN
END
DECLARE @current INT
SELECT @current = cn FROM Course065 WHERE Cno = @cnoIF @current >= 50
BEGINPRINT '该课程人数已满'RETURN
ENDUPDATE Course065 SET cn = cn + 1 WHERE Cno = @cno
INSERT INTO Score065(Sno, Cno, Degree) VALUES (@sno, @cno, 0)
PRINT '选课成功'
END
GO
– 示例调用
EXEC cs065 ‘S002’, ‘C001’;
7.退选课程CSDXXX
某学生选了某课程后,要退选,该课程的当前选课人数减1,并删除其对应的成绩。
EXEC csdXXX 学号 , 课程号
– 示例调用
EXEC cs065 ‘S002’, ‘C001’;
GO
CREATE PROCEDURE csd065 @sno CHAR(3), @cno CHAR(5)
AS
BEGIN
IF NOT EXISTS (SELECT 1 FROM Score065 WHERE Sno = @sno AND Cno = @cno)
BEGIN
PRINT ‘该学生未选修此课程’
RETURN
END
DELETE FROM Score065 WHERE Sno = @sno AND Cno = @cno
UPDATE Course065 SET cn = cn - 1 WHERE Cno = @cno
PRINT '退选成功'
END
GO
– 示例调用
EXEC csd065 ‘S002’, ‘C001’;
8… 查询学生成绩cxXXX
某学生选了某课程后, 可以查询其成绩(out)
EXEC cxXXX 学号 , 课程号
GO
CREATE PROCEDURE cx065 @sno CHAR(3), @cno CHAR(5), @degree DECIMAL(5,1) OUTPUT
AS
BEGIN
SELECT @degree = Degree FROM Score065 WHERE Sno = @sno AND Cno = @cno
IF @@ROWCOUNT = 0
BEGIN
PRINT ‘未找到该学生的成绩记录’
RETURN
END
END
GO
– 调用
DECLARE @score DECIMAL(5,1)
EXEC cx065 ‘S001’, ‘C001’, @score OUTPUT
SELECT @score AS Score;
思考题
(1)什么标量函数和表值函数?
标量函数返回的是单个值,即返回一个数字或者字符串
表值函数返回的是表的结构,一般是多行数据
(2)函数定义和调用应注意哪些事项?
必须使用 DBO. 前缀调用用户自定义函数;
函数不能修改数据库状态(如插入、更新);
参数类型要匹配;
避免在函数中使用 PRINT,应尽量只返回值。
(3)定义存储过程有哪些选项?分别表示什么意思
@parameter OUTPUT:用于返回值;
SET NOCOUNT ON:禁止显示影响行数的消息;
RAISERROR():抛出错误信息;
IF @@ROWCOUNT = 0:判断是否影响了行;
支持事务控制(BEGIN TRANSACTION, COMMIT, ROLLBACK);
实验小结(实验中遇到的问题及解决过程、实验中产生的错误及原因分析、实验体会和收获)
通过本次数据库实验——函数与存储过程的设计与实现,我对 SQL Server 中程序化对象的使用有了更加深入的理解和实践。
在实验过程中,我从最基础的函数编写开始,逐步掌握了如何将一些重复性的业务逻辑封装成函数。比如,在编写 FMax065 和 Fc065 这样的标量函数时,我学会了如何处理输入参数、进行条件判断,并返回一个确定的值;而在编写如 Fsc065 和 FCJA065 这类表值函数时,我理解了函数不仅可以返回单个值,还可以返回整个结果集。
随后,在存储过程部分,我尝试将更复杂的业务逻辑(如成绩统计、选课控制)封装到存储过程中。例如,printcourse065 要求我对成绩进行分段统计并更新临时表,这个过程中我学习到了如何使用变量、条件分支以及动态更新数据。而 cs065 和 csd065 两个选课/退选的存储过程则让我意识到,实际系统中需要考虑并发控制、状态一致性等问题,比如当前课程是否已满、学生是否已经选过该课程等边界情况,这些都需要在设计时充分考虑。
在完成设计性实验的过程中,我也遇到了不少挑战。甚至还有一些没有解决的问题,如在设计性实验中返回该生平均分和班级排名时返回的是一个空值,这肯定是不对的,还有就是当创建函数后发现函数内部的值有问题但是又不能直接重新再创建一遍时该怎么处理会比较合适?对于 cs065 存储过程,如果多个用户同时尝试选同一门课,会不会出现并发冲突?有没有更好的方式来保证选课人数的准确性?这让我明白了:SQL 不只是写出来就能运行,更重要的是逻辑正确、效率合理。数据库不仅仅是建表和查询,更是工程化的系统设计。它涉及事务、锁、索引、并发控制等多个方面,这些内容虽然我现在还不能完全掌握,但已经激发了我进一步学习的兴趣。
总的来说,这次实验让我认识到自己在数据库编程方面的不足。我希望未来能继续深入学习 T-SQL 高级特性,比如游标、触发器、事务控制等,争取写出更专业、更健壮的数据库程序。同时,也希望自己能在今后的学习和项目中,把今天学到的知识应用得更好,真正做到学以致用。
相关文章:

数据库实验10
设计性实验 1.实验要求 1.编写函数FsumXXX,1~n(参数)求和; GO CREATE FUNCTION Fsum065 (n INT) RETURNS INT AS BEGIN DECLARE sum INT 0 WHILE n > 0 BEGIN SET sum sum n SET n n - 1 END RETURN sum END …...
Yocto是如何使用$D目录来构建文件系统的?
Yocto最终会将所有Recipe的${D}(部署目录)下的文件整合到根文件系统中,但这一过程并非简单收集所有内容,而是通过分阶段打包、依赖管理和定制化配置实现的。以下是核心机制的解析: 一、${D}目录的作用与文件收集原理 ${D}的定位 ${D}是模拟目标系统根文件结构的临时目录(…...

jflash下载时出现 Could not read unit serial number! 的解决方法
出现的原因是由于Jlink原厂固件SN码是-1 我用的版本是v6.40 解决方法:添加序列号 1.打开:J-Link commander 之后在命令栏输入:exec setsnxxxxxxxx 2.添加序列号到license,打开J-Link License Manager V6.40 jlink-v640下载软件…...

Linux 信号终篇(总结)
前文:本文是对信号从产生到被处理的过程中的概念和原理的总结,如果想了解具体实现,请查看前两篇博客:Linux 信号-CSDN博客、Linux 信号(下篇)-CSDN博客 一、信号的产生 1.1 信号产生的五种条件 ①键盘组…...
使用Kotlin Flow实现Android应用的响应式编程
在Android应用中使用Kotlin Flow实现响应式编程可以分为以下步骤,结合最佳实践和生命周期管理: 1. 添加依赖 在build.gradle中确保包含协程和生命周期相关依赖: dependencies {implementation("org.jetbrains.kotlinx:kotlinx-corouti…...
react中的用法——setDisabled dva dispatch effects
setDisabled 在react中,setDisabled通常是指通过状态管理来控制某个组件(如按钮、输入框等)的禁用状态。虽然react本身没有内置的setDisabled方法,但你可以使用useState钩子来实现类似的功能。以下是一个简单的示例,展…...
(九)Java Object类的使用全面解析
一、Object类概述 1.1 Object类在Java中的地位 在Java语言中,Object类是所有类的超类,位于类继承树的顶端。它是Java类层次结构中的根类,每个类都直接或间接继承自Object类。当我们定义一个类时,如果没有明确使用extends关键字指…...

LVGL对象(Objects)
文章目录 🧱 一、LVGL 中的对象(lv\_obj)🔹 lv\_obj\_t 的作用 🧩 二、对象的分类结构(类比继承)🧰 三、对象的创建与销毁✅ 创建对象示例:创建一个按钮❌ 删除对象 &…...
自然语言到 SQL 转换:开启智能数据库交互新时代
引言 随着人工智能技术的飞速发展,自然语言处理(NLP)领域取得了显著的进步。其中,将自然语言转换为 SQL 语句的技术尤为引人注目。这种技术能够帮助用户,尤其是那些不熟悉 SQL 的业务人员,快速从数据库中获…...

服务器配置错误导致SSL/TLS出现安全漏洞,如何进行排查?
SSL/TLS 安全漏洞排查与修复指南 一、常见配置错误类型 弱加密算法与密钥问题 使用弱密码套件(如DES、RC4)或密钥长度不足(如RSA密钥长度<2048位),导致加密强度不足。 密钥管理不当(如私钥未加密存…...

路由重发布
路由重发布 实验目标: 掌握路由重发布的配置方法和技巧; 掌握通过路由重发布方式实现网络的连通性; 熟悉route-pt路由器的使用方法; 实验背景:假设学校的某个分区需要配置简单的rip协议路由信息,而主校…...

C++修炼:stack和queue
Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路! 我的博客:<但凡. 我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞,关注&am…...
【软件工程】基于频谱的缺陷定位
基于频谱的缺陷定位(Spectrum-Based Fault Localization, SBFL)是一种通过分析程序执行覆盖信息(频谱数据)来定位代码中缺陷的方法。其核心思想是:通过测试用例的执行结果(成功/失败)和代码覆盖…...

【计算机视觉】优化MVSNet可微分代价体以提高深度估计精度的关键技术
优化MVSNet可微分代价体以提高深度估计精度的关键技术 1. 代价体基础理论与分析1.1 标准代价体构建1.2 关键问题诊断 2. 特征表示优化2.1 多尺度特征融合2.2 注意力增强匹配 3. 代价体构建优化3.1 自适应深度假设采样3.2 可微分聚合操作改进 4. 正则化与优化策略4.1 多尺度代价…...
为什么tcp不能两次握手
TCP **不能用“两次握手”**的根本原因是:两次握手无法确保双方“都知道”连接是可靠建立的,容易引发“旧连接请求”造成错误连接。 🔁 先看标准的 三次握手(3-Way Handshake)流程 客户端 服务器| …...
常见音频主控芯片以及相关厂家总结
音频主控芯片是音频设备(如蓝牙耳机、音箱、功放等)的核心组件,负责音频信号的解码、编码、处理和传输。以下是常见的音频主控芯片及其相关厂家,按应用领域分类: 蓝牙音频芯片 主要用于无线耳机、音箱等设备࿰…...
掌握 Kubernetes 和 AKS:热门面试问题和专家解答
1. 在 AKS(Azure Kubernetes 服务)中,集群、节点、Pod 和容器之间的关系和顺序是什么? 在 AKS(Azure Kubernetes 服务)中,集群、节点、Pod 和容器之间的关系和顺序如下: 集群&#…...
【MyBatis-7】深入理解MyBatis二级缓存:提升应用性能的利器
在现代应用开发中,数据库访问往往是性能瓶颈之一。作为Java生态中广泛使用的ORM框架,MyBatis提供了一级缓存和二级缓存机制来优化数据库访问性能。本文将深入探讨MyBatis二级缓存的工作原理、配置方式、使用场景以及最佳实践,帮助开发者充分利…...
5.9-selcct_poll_epoll 和 reactor 的模拟实现
5.9-select_poll_epoll 本文演示 select 等 io 多路复用函数的应用方法,函数具体介绍可以参考我过去写的博客。 先绑定监听的文件描述符 int sockfd socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in serveraddr; memset(&serveraddr, 0, sizeof(struc…...
《算法导论(第4版)》阅读笔记:p17-p27
《算法导论(第4版)》学习第 10 天,p17-p27 总结,总计 11 页。 一、技术总结 1. insertion sort (1)keys The numbers to be sorted are also known as the keys(要排序的数称为key)。 第 n 次看插入排序,这次有两个地方感触比较深&#…...

软考错题集
一个有向图具有拓扑排序序列,则该图的邻接矩阵必定为()矩阵。 A.三角 B.一般 C.对称 D.稀疏矩阵的下三角或上三角部分包含非零元素,而其余部分为零。一般矩阵这个术语太过宽泛,不具体指向任何特定性 质的矩阵。对称矩阵…...

T2I-R1:通过语义级与图像 token 级协同链式思维强化图像生成
文章目录 速览摘要1 引言2 相关工作统一生成与理解的 LMM(Unified Generation and Understanding LMM.)用于大型推理模型的强化学习(Reinforcement Learning for Large Reasoning Models.)3 方法3.1 预备知识3.2 语义级与令牌级 CoT语义级 CoT(Semantic-level CoT)令牌级…...

Dockers部署oscarfonts/geoserver镜像的Geoserver
Dockers部署oscarfonts/geoserver镜像的Geoserver 说实话,最后发现要选择合适的Geoserver镜像才是关键,所以所以所以…🐷 推荐oscarfonts/geoserver的镜像! 一开始用kartoza/geoserver镜像一直提示内存不足,不过还好…...
【脑机接口临床】脑机接口手术的风险?脑机接口手术的应用场景?脑机接口手术如何实现偏瘫康复?
脑机接口的应用 通常对脑机接口感兴趣的两类人群,一类是适应症患者 ,另一类是科技爱好者。 1 意念控制外部设备 常见的外部设备有:外骨骼、机械手、辅助康复设备、电刺激设备、电脑光标、轮椅。 2 辅助偏瘫康复或辅助脊髓损伤患者意念控制…...

扩增子分析|微生物生态网络稳定性评估之鲁棒性(Robustness)和易损性(Vulnerability)在R中实现
一、引言 周集中老师团队于2021年在Nature climate change发表的文章,阐述了网络稳定性评估的原理算法,并提供了完整的代码。自此对微生物生态网络的评估具有更全面的指标,自此网络稳定性的评估广受大家欢迎。本系列将介绍网络稳定性之鲁棒性…...
Client 和 Server 的关系理解
client.py 和 server.py 是基于 MCP(Multi-Component Protocol)协议的客户端-服务端架构,二者的关系如下: 1. 角色分工 server.py:服务端,负责注册和实现各种“工具函数”(如新闻检索、情感分…...

【含文档+PPT+源码】基于微信小程序的社区便民防诈宣传系统设计与实现
项目介绍 本课程演示的是一款基于微信小程序的社区便民防诈宣传系统设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套…...
Kafka的核心组件有哪些?简要说明其作用。 (Producer、Consumer、Broker、Topic、Partition、ZooKeeper)
Kafka 核心组件解析 1. 基础架构图解 ┌─────────┐ ┌─────────┐ ┌─────────┐ │Producer │───▶ │ Broker │ ◀─── │Consumer │ └─────────┘ └─────────┘ └────────…...
Java中对象集合转换的优雅实现【实体属性范围缩小为vo】:ListUtil.convert方法详解
1.业务场景 在开发电商系统时,我们经常需要处理订单信息的展示需求。例如:订单详情页需要显示退款信息列表,而数据库中存储的RefundInfo实体类包含敏感字段,直接返回给前端存在安全风险。此时就需要将RefundInfo对象集合转换为Or…...

【MySQL】存储引擎 - ARCHIVE、BLACKHOLE、MERGE详解
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...