创建数据库存储过程与触发器:showscore与s_del
需积分: 1 199 浏览量
更新于2024-09-11
收藏 51KB DOCX 举报
"数据库习题,包括创建存储过程和触发器"
在数据库管理中,存储过程和触发器是两个非常重要的概念。存储过程是预编译的SQL语句集合,可以封装一系列操作,并且可以带有参数,便于重复使用。而触发器是一种特殊的存储过程,它在特定的数据操作(如INSERT、UPDATE或DELETE)发生时自动执行,可以用来实施复杂的业务规则和数据完整性。
题目中的第一个任务是创建一个名为“showscore”的存储过程,用于根据学生姓名显示他们的课程数量、不及格课程数量以及平均成绩。存储过程的实现首先通过JOIN操作连接SC表和S表,基于学生的姓名查询他们选修的课程总数(@Count)和平均成绩(@Avg)。接着,同样通过JOIN查询,但加上成绩小于60的条件,来计算不及格课程的数量(@uCount)。最后,将这些信息格式化后输出。
具体代码如下:
```sql
CREATE PROC showscore
@姓名 varchar(20)
AS
BEGIN
DECLARE @Count INT, @uCount INT, @Avg FLOAT, @Str VARCHAR(300)
SELECT @Count = COUNT(课号), @Avg = AVG(成绩) FROM SC, S WHERE SC.学号 = S.学号 AND S.姓名 = @姓名
SELECT @uCount = ISNULL(COUNT(课程), 0) FROM SC, S WHERE SC.学号 = S.学号 AND S.姓名 = @姓名 AND 成绩 < 60
SET @Str = @姓名 + '同学一共选了' + CAST(@Count AS VARCHAR(3)) + '门课程' + '其中有' + CAST(@uCount AS VARCHAR(3)) + '门不及格' + '其平均成绩为' + CAST(@avg AS VARCHAR(5)) + '分'
PRINT @Str
END
```
这个存储过程执行时,如示例所示,传入学生姓名(例如'王飞'),会显示对应的学生的课程情况。
第二个任务是创建一个名为“s_del”的删除触发器,当尝试从S表中删除学生时,如果该学生在SC表中有选课记录,则阻止删除操作并给出提示;否则,允许删除并将其记录保存到S_BAK表中,用于后续可能的数据恢复。触发器的实现通过检查DELETED表(在删除操作后包含被删除的行)和SC表的交集来判断是否存在选课记录。
具体代码如下:
```sql
CREATE TRIGGER s_del
ON S
FOR DELETE
AS
BEGIN
IF EXISTS (SELECT * FROM SC, DELETED WHERE DELETED.学号 = SC.学号)
BEGIN
RAISERROR('试图删除有课的学生,删除失败!', 16, 1)
END
ELSE
BEGIN
INSERT INTO S_BAK SELECT * FROM DELETED
PRINT '删除成功'
END
END
```
这个触发器在执行删除操作时,如果发现被删除的学生有选课记录,会抛出错误,阻止删除;否则,将被删除的记录插入到S_BAK表中,并打印“删除成功”作为提示。
这两个数据库操作体现了存储过程和触发器在实际应用中的功能,它们能够增强数据库的灵活性和安全性,简化复杂操作,同时也确保了数据的一致性和完整性。
2020-03-20 上传
2023-04-25 上传
2022-07-13 上传
2019-07-31 上传
2023-05-31 上传
2014-04-22 上传
2015-06-30 上传
2015-08-09 上传
lijuanzhangrongxuan
- 粉丝: 0
- 资源: 4
最新资源
- 火炬连体网络在MNIST的2D嵌入实现示例
- Angular插件增强Application Insights JavaScript SDK功能
- 实时三维重建:InfiniTAM的ros驱动应用
- Spring与Mybatis整合的配置与实践
- Vozy前端技术测试深入体验与模板参考
- React应用实现语音转文字功能介绍
- PHPMailer-6.6.4: PHP邮件收发类库的详细介绍
- Felineboard:为猫主人设计的交互式仪表板
- PGRFileManager:功能强大的开源Ajax文件管理器
- Pytest-Html定制测试报告与源代码封装教程
- Angular开发与部署指南:从创建到测试
- BASIC-BINARY-IPC系统:进程间通信的非阻塞接口
- LTK3D: Common Lisp中的基础3D图形实现
- Timer-Counter-Lister:官方源代码及更新发布
- Galaxia REST API:面向地球问题的解决方案
- Node.js模块:随机动物实例教程与源码解析