《数据库原理与应用》(第三版)第11章 存储过程和触发器 基础 习题参考答案

习题
1.存储过程的作用是什么?为什么利用存储过程可以提高数据的操作效率?
答:(1)允许模块化程序设计
(2)改善性能
(3)减少网络流量
(4)可作为安全机制使用
因为系统对存储过程是预编译的。

2.在定义存储过程的语句中是否可以包含数据的增、删、改语句?
答:可以。

3.用户和存储过程之间如何传递数据?
答:可通过输入、输出参数。或者

4.存储过程的参数有几种形式?
答:有输入和输出两种。

5.触发器的作用是什么? 前触发和后触发的主要区别是什么?
答:实现复杂的处理逻辑和商业规则,增强了数据完整性约束的功能。
前触发器是在引发触发器执行的操作之前先执行触发器;后触发器是在引发触发器执行的操作执行完后再执行触发器。

6.插入操作产生的临时工作表叫什么?它存放的是什么数据?
答:inserted,存放新插入的数据。

7.删除操作产生的临时工作表叫什么?它存放的是什么数据?
答:deleted,存放被删除的数据。

8.更改操作产生的两个临时工作表叫什么?其结构分别是什么,它们分别存放的是什么数据?
答:inserted和deleted,结构同定义触发器的表,分别存放更新前和更新后的数据。

上机练习
1.利用第11章建立的students数据库以及Student、Coures、SC表,创建满足下述要求的存储过程,并查看存储过程的执行结果。
(1)查询每个学生的修课总学分,要求列出学生学号及总学分。
create proc p1
as
select sno,SUM(credit) as 总学分
from SC
group by sno

(2)查询学生的学号、姓名、修的课程号、课程名、课程学分,将学生所在的系作为输入参数,执行此存储过程,并分别指定一些不同的输入参数值。
create proc p2
@dept varchar(20) = ‘计算机系’
as
select s.sno,sname,c.cno,cname,credit
from Student s join SC on s.Sno=SC.Sno
join Course c on c.Cno=SC.Cno
where Sdept = @dept
执行示例1:EXEC P2
执行示例2:EXEC P2 ‘通信工程系’

(3)查询指定系的男生人数,其中系为输入参数,人数用输出参数返回。
create proc p3
@dept varchar(20),@rs int output
as
select @rs = COUNT(*) from Student
where Sdept = @dept and Ssex = ‘男’

(4)查询考试平均成绩超过指定分值的学生学号和平均成绩。
create proc p4
@x int
as
select sno,avg(grade) from sc
group by sno
having avg(grade) > @x

(5)查询查询指定系的学生中,选课门数最多的学生的选课门数和平均成绩,要求系为输入参数,选课门数和平均成绩用输出参数返回。
create proc p5
@dept varchar(30),@cnt int output,@avg int output
as
select top 1 @cnt = count() ,@avg = avg(grade)
from sc join student s on s.sno = sc.sno
where sdept = @dept
group by s.sno
order by count(
) desc

(6)删除指定学生的指定课程的修课记录,其中学号和课程号为输入参数。
create proc p6
@sno char(7),@cno char(10)
as
delete from SC where Sno = @sno and cno = @cno

(7)修改指定课程的开课学期。输入参数为:课程号和修改后的开课学期,开课学期的默认值为2。如果指定的开课学期不在1~8范围内,则不进行修改。
create proc p7
@cno char(10) , @new_semester int = 2
as
if @new_semester between 1 and 8
update course set semester = @new_semester
where cno = @cno
3.修改第1题(1)的存储过程,使之能够查询指定系中,每个学生选课总门数、总学分和考试平均成绩。
alter proc p1
@dept varchar(30)
as
select s.sno,count(*) 选课总门数,SUM(credit) as 总学分,
Avg(grade) 考试平均成绩
from SC join student s on s.sno = SC.sno
group by s.sno

4.利用第11章建立的students数据库以及Student、Coures、SC表,创建满足如下要求的触发器,并检测触发器的功效。
(1)限制考试成绩必须在0~100范围内。
create trigger tri1 on sc after insert,update
as
if exists(select * from inserted
where grade not between 0 and 100)
rollback

(2)限制学生所在系的取值必须在{计算机系,信息系,物理系,数学系}范围内。
create trigger tri2 on student after insert,update
as
if exists(select * from student where sdept not in
(‘计算机系’,‘信息系’,‘物理系’,‘数学系’))
Rollback
(3)限制学生的选课总门数不能超过8门。
create trigger tri4 on sc after insert
as
if exists(select * from sc
where sno in (select sno from inserted)
group by sno
having count(*) > 8 )
rollback
(4)限制不能删除考试成绩不及格学生的考试记录。
create trigger tri4 on sc after delete
as
if exists(select * from deleted where grade < 60 )
rollback
5.利用11.3节创建的工作表和职工表,定义满足如下要求的触发器,并检测触发器的功效。
(1)限制职工的基本工资和浮动工资之和必须大于等于2000。
create trigger tri4 on 职工表 after insert,update
as
if exists(select * from inserted where (基本工资 + 浮动工资 ) <2000 )
Rollback

(2)限制工作表中最高工资不能低于最低工资的1.5倍。
create trigger tri5 on 工作表 after insert,update
as
if exists(select * from inserted where 最高工资 < 最低工资*1.5 )
Rollback

(3)限制不能删除基本工资低于1500的职工。
create trigger tri6 on 职工表 after delete
as
if exists(select * from deleted where 基本工资 < 1500 )
Rollback

发布了750 篇原创文章 · 获赞 471 · 访问量 32万+

猜你喜欢

转载自blog.csdn.net/weixin_43336281/article/details/105500561