《数据库原理与应用》(第三版)第11章 存储过程和触发器 基础 习题参考答案
習(xí)題
1.存儲過程的作用是什么?為什么利用存儲過程可以提高數(shù)據(jù)的操作效率?
答:(1)允許模塊化程序設(shè)計
(2)改善性能
(3)減少網(wǎng)絡(luò)流量
(4)可作為安全機(jī)制使用
因為系統(tǒng)對存儲過程是預(yù)編譯的。
2.在定義存儲過程的語句中是否可以包含數(shù)據(jù)的增、刪、改語句?
答:可以。
3.用戶和存儲過程之間如何傳遞數(shù)據(jù)?
答:可通過輸入、輸出參數(shù)。或者
4.存儲過程的參數(shù)有幾種形式?
答:有輸入和輸出兩種。
5.觸發(fā)器的作用是什么? 前觸發(fā)和后觸發(fā)的主要區(qū)別是什么?
答:實現(xiàn)復(fù)雜的處理邏輯和商業(yè)規(guī)則,增強了數(shù)據(jù)完整性約束的功能。
前觸發(fā)器是在引發(fā)觸發(fā)器執(zhí)行的操作之前先執(zhí)行觸發(fā)器;后觸發(fā)器是在引發(fā)觸發(fā)器執(zhí)行的操作執(zhí)行完后再執(zhí)行觸發(fā)器。
6.插入操作產(chǎn)生的臨時工作表叫什么?它存放的是什么數(shù)據(jù)?
答:inserted,存放新插入的數(shù)據(jù)。
7.刪除操作產(chǎn)生的臨時工作表叫什么?它存放的是什么數(shù)據(jù)?
答:deleted,存放被刪除的數(shù)據(jù)。
8.更改操作產(chǎn)生的兩個臨時工作表叫什么?其結(jié)構(gòu)分別是什么,它們分別存放的是什么數(shù)據(jù)?
答:inserted和deleted,結(jié)構(gòu)同定義觸發(fā)器的表,分別存放更新前和更新后的數(shù)據(jù)。
上機(jī)練習(xí)
1.利用第11章建立的students數(shù)據(jù)庫以及Student、Coures、SC表,創(chuàng)建滿足下述要求的存儲過程,并查看存儲過程的執(zhí)行結(jié)果。
(1)查詢每個學(xué)生的修課總學(xué)分,要求列出學(xué)生學(xué)號及總學(xué)分。
create proc p1
as
select sno,SUM(credit) as 總學(xué)分
from SC
group by sno
(2)查詢學(xué)生的學(xué)號、姓名、修的課程號、課程名、課程學(xué)分,將學(xué)生所在的系作為輸入?yún)?shù),執(zhí)行此存儲過程,并分別指定一些不同的輸入?yún)?shù)值。
create proc p2
@dept varchar(20) = ‘計算機(jī)系’
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
執(zhí)行示例1:EXEC P2
執(zhí)行示例2:EXEC P2 ‘通信工程系’
(3)查詢指定系的男生人數(shù),其中系為輸入?yún)?shù),人數(shù)用輸出參數(shù)返回。
create proc p3
@dept varchar(20),@rs int output
as
select @rs = COUNT(*) from Student
where Sdept = @dept and Ssex = ‘男’
(4)查詢考試平均成績超過指定分值的學(xué)生學(xué)號和平均成績。
create proc p4
@x int
as
select sno,avg(grade) from sc
group by sno
having avg(grade) > @x
(5)查詢查詢指定系的學(xué)生中,選課門數(shù)最多的學(xué)生的選課門數(shù)和平均成績,要求系為輸入?yún)?shù),選課門數(shù)和平均成績用輸出參數(shù)返回。
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)刪除指定學(xué)生的指定課程的修課記錄,其中學(xué)號和課程號為輸入?yún)?shù)。
create proc p6
@sno char(7),@cno char(10)
as
delete from SC where Sno = @sno and cno = @cno
(7)修改指定課程的開課學(xué)期。輸入?yún)?shù)為:課程號和修改后的開課學(xué)期,開課學(xué)期的默認(rèn)值為2。如果指定的開課學(xué)期不在1~8范圍內(nèi),則不進(jìn)行修改。
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)的存儲過程,使之能夠查詢指定系中,每個學(xué)生選課總門數(shù)、總學(xué)分和考試平均成績。
alter proc p1
@dept varchar(30)
as
select s.sno,count(*) 選課總門數(shù),SUM(credit) as 總學(xué)分,
Avg(grade) 考試平均成績
from SC join student s on s.sno = SC.sno
group by s.sno
4.利用第11章建立的students數(shù)據(jù)庫以及Student、Coures、SC表,創(chuàng)建滿足如下要求的觸發(fā)器,并檢測觸發(fā)器的功效。
(1)限制考試成績必須在0~100范圍內(nèi)。
create trigger tri1 on sc after insert,update
as
if exists(select * from inserted
where grade not between 0 and 100)
rollback
(2)限制學(xué)生所在系的取值必須在{計算機(jī)系,信息系,物理系,數(shù)學(xué)系}范圍內(nèi)。
create trigger tri2 on student after insert,update
as
if exists(select * from student where sdept not in
(‘計算機(jī)系’,‘信息系’,‘物理系’,‘?dāng)?shù)學(xué)系’))
Rollback
(3)限制學(xué)生的選課總門數(shù)不能超過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)限制不能刪除考試成績不及格學(xué)生的考試記錄。
create trigger tri4 on sc after delete
as
if exists(select * from deleted where grade < 60 )
rollback
5.利用11.3節(jié)創(chuàng)建的工作表和職工表,定義滿足如下要求的觸發(fā)器,并檢測觸發(fā)器的功效。
(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
總結(jié)
以上是生活随笔為你收集整理的《数据库原理与应用》(第三版)第11章 存储过程和触发器 基础 习题参考答案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《数据库原理与应用》(第三版)第9章 事
- 下一篇: 《数据库原理与应用》(第三版)第12章