当前位置:文档之家› 数据库实验报告 (6)

数据库实验报告 (6)

一实验题目1.存储过程的定义和使用2.触发器的创建与使用二实验目的1.掌握存储过程的定义、执行和调用方法。

2.掌握触发器的创建与使用。

三实验内容1.存储过程的定义和使用(1)创建存储过程查找姓李的学生的选修课成绩信息。

(2)创建存储过程,统计每个学生的选修课的总成绩,显示成绩最好的前3名学生成绩。

(3)创建存储过程,查找某门课的最高分(带输入参数的存储过程)。

(4)创建存储过程,统计某个同学的平均分并返回统计结果。

(带输入和输出参数的存储过程)(5)创建存储过程,统计某门课选修的人数,将人数返回。

(带返回值的存储过程)(6)创建存储过程,统计选修课程最多的学生的基本信息。

(存储过程的嵌套)2.触发器的创建与使用(1)定义一个BEFORE行级触发器credit_TRIGER,当为C表插入新的课程信息时,若学分大于5分,自动修改为5分。

(2)定义一个AFTER行级触发器,当SC表的成绩发生变动时,就自动在成绩变化表sc_log中增加一条新的纪录,该新纪录包括:操作者名称、操作日期、操作类型。

(3)建立一个DELETE触发器,针对于SC表,每次只能删除一条信息。

(4)建立一个UPDATE的触发器,不允许用户更改学生学号,若更改学号,给出提示信息:学号不允许更改。

(5)执行相应的SQL语句,触发上述定义的触发器。

(6)删除触发器credit_TRIGER。

四实验步骤1.存储过程的定义和使用存储过程格式:CREATE PROC [ EDURE ] procedure_name [ ; number ][ { @parameter data_type }[ VARYING ] [ = default ] [ OUTPUT ][ WITH{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ][ FOR REPLICATION ]AS sql_statement [ ...n ]创建存储过程查找姓李的学生的选修课成绩信息。

(1)创建存储过程,统计每个学生的选修课的总成绩,显示成绩最好的前3名学生成绩。

SC表基本情况如图表1所示:图表 1代码:create proc p_sumscoreasselect TOP 3 sum(Grade)as 总成绩from SC group by Snoexec p_sumscore运行结果:命令已成功完成。

显示结果如图表2:图表2总成绩前三名(2)创建存储过程,查找某门课的最高分(带输入参数的存储过程)。

代码:create proc p_maxscoreas@courseselect distinct max(Grade)as 最高成绩from SC where Cno=@course运行结果:第 3 行: '@course' 附近有语法错误。

必须声明变量'@course'。

必须声明变量;且create proc 必须为第一条语句正确代码:create proc p_maxscore(@course nchar(6))asselect distinct max(Grade)as 最高成绩from SC where Cno=@course group by Cno exec p_maxscore'0001'运行结果:命令已成功完成。

显示结果如图表3:图表3课程号为0001的最高分为68(3)创建存储过程,统计某个同学的平均分并返回统计结果。

(带输入和输出参数的存储过程)代码:create procedure p_avg @Sno char(10),@Result int outputasselect @Result =(select avg(Grade)from SCwhere Sno=@Sno)运行结果:命令已成功完成。

declare @Result int,@Sno char(10)set @Sno ='0002'exec p_avg @Sno ,@Result outputprint '学号为'+@Sno+'的平均分:'+cast(@Result as char(2))运行结果:学号为0002 的平均分:79(4)创建存储过程,统计某门课选修的人数,将人数返回。

(带返回值的存储过程)代码:create procedure p_num @Cno char(10),@Num int outputasselect @Num =(select count(Cno)from SCwhere Cno=@Cno)运行结果:命令已成功完成。

declare @Num int,@Cno char(4)set @Cno ='0002'exec p_num @Cno ,@Num outputprint '课程号为'+@Cno+'的人数:'+cast(@Num as char(2))运行结果:图表4选修课程号为0002的人数为2(5)创建存储过程,统计选修课程最多的学生的基本信息。

(存储过程的嵌套)代码:CREATE PROCEDURE p_maxAsselect * from Swhere Sno in(select top 1 Sno from SCgroup by Sno order by count(SC.sno)desc运行结果:命令已成功完成。

运行过程:exec p_max显示结果如图表5:图表5李四选修课最多为三门2.触发器的创建与使用语句格式:CREATE TRIGGER trigger_nameON { table | view }[ WITH ENCRYPTION ]{{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }[ WITH APPEND ][ NOT FOR REPLICATION ]AS[ { IF UPDATE ( column )[ { AND | OR } UPDATE ( column ) ][ ...n ]| IF ( COLUMNS_UPDA TED ( ) { bitwise_operator } updated_bitmask ){ comparison_operator } column_bitmask [ ...n ]} ]sql_statement [ ...n ]}}(1)定义一个BEFORE行级触发器credit_TRIGER,当为C表插入新的课程信息时,若学分大于5分,自动修改为5分。

代码:create trigger credit_TRIGERon Cfor insertas beginUPDATE C set Ccredit=5from Cwhere Ccredit>5end;运行结果:命令已成功完成。

运行显示结果如图6图表 6 C表增加触发器credit_TRIGER(2)定义一个AFTER行级触发器,当SC表的成绩发生变动时,就自动在成绩变化表sc_log中增加一条新的纪录,该新纪录包括:操作者名称、操作日期、操作类型。

代码:创建表格:create table SC_log(SCname char(10),SCdata char(12),SCtype char(10))运行结果:命令已成功完成。

创建触发器:create trigger update_SCon SC after updateasinsert into SC_log(SCname ,SCdata,SCtype)values(user,convert(varchar(12),getdate(),1),'update')运行结果:命令已成功完成。

update SC set Grade=66 where Sno='0001'、运行结果:(所影响的行数为 1 行)运行显示结果如图7:图7每次更新插入一条记录(3)建立一个DELETE触发器,针对于SC表,每次只能删除一条信息。

代码:create trigger delete_SC on SC for delete asdeclare @row_cnt intselect @row_cnt=count(*) from SCif @row_cnt>1beginprint 'SC中每次允许删除一条记录'rollback transactionEnd运行结果:命令已成功完成。

运行显示结果如图:图表8建立触发器delete_SC验证语句:delete from SC where Sno='0002'验证结果:图表9删除时提示每次允许删除一条记录(4)建立一个UPDATE的触发器,不允许用户更改学生学号,若更改学号,给出提示信息:学号不允许更改。

代码:create trigger SC_update on Sfor updateasif update (Sno)beginprint '学号不允许更改';rollback ;end运行结果:命令已成功完成。

运行显示结果如图10:图表10建立触发器update_SC(5)执行相应的SQL语句,触发上述定义的触发器。

代码Update S set Sno=00014 where Sname='刘一'运行结果:学号不允许更改(6)删除触发器credit_TRIGER。

代码:if exists(select name from sysobjects where type='TR'and name='credit_TRIGER ') drop trigger credit_TRIGERGo运行结果:命令已成功完成。

如图无触发器图表10删除成功,无此触发器。

相关主题