数据库实验报告4分析解析.docx
《数据库实验报告4分析解析.docx》由会员分享,可在线阅读,更多相关《数据库实验报告4分析解析.docx(13页珍藏版)》请在冰豆网上搜索。
数据库实验报告4分析解析
华中敏20122211042100522012级计科一班
存储过程的创建和使用
1:
创建一个名称为“StuInfo”的存储过程,要求完成以下功能:
在T_STUDENT表中查询05541班学生的学号、姓名、性别、出生日期和政治面貌五个字段的内容。
CREATEPROCEDUREStuInfo
AS
SelectS_NUMBERAS学号,
S_NAMEAS姓名,
SEXAS性别,
BIRTHDAYAS出生日期,
POLITYAS政治面貌
FROMT_STUDENT
WHERELEFT(S_NUMBER,5)='05541'
2:
创建一个存储过程StuScoreInfo,完成的功能是在表T_STUDENT、表T_COURSE和表t_SCORE中查询以下字段:
班级、学号、姓名、性别、课程名称、考试分数。
--打开STUDENT数据库USESTUDENT
--查询是否已存在此存储过程,如果存在,就删除它
IFEXISTS(SELECTnameFROMsysobjects
WHEREname='StuScoreInfo'ANDtype='P')
DROPPROCEDUREStuScoreInfo
GO
--创建存储过程
CREATEPROCEDUREStuScoreInfo
ASSelect班级=SUBSTRING(T_STUDENT.S_NUMBER,1,
LEN(T_STUDENT.S_NUMBER)-2),
学号=SUBSTRING(T_STUDENT.S_NUMBER,
LEN(T_STUDENT.S_NUMBER)-1,2),
T_STUDENT.S_NAMEAS姓名,
SEXAS性别,
T_COURSE.C_NAMEAS课程名称,
T_SCORE.SCOREAS考试分数
FROMT_STUDENT,T_COURSE,T_SCORE
WHERET_STUDENT.S_NUMBER=t_SCORE.S_NUMBERANDT_COURSE.C_NUMBER=t_SCORE.C_NUMBER
GO
3:
创建一个带有参数的存储过程Stu_Info,该存储过程根据传入的学生编号,在T_STUDENT中查询此学生的信息。
--删除已存在的存储过程
USEStudent_back
IFEXISTS(SELECTnameFROMsysobjects
WHEREname='Stu_Info'ANDtype='P')
DROPPROCEDUREStu_Info
GO
--创建存储过程
USEStudent_back
GO
CREATEPROCEDUREStu_Info
@S_NUMBERvarchar(10)
AS
Select班级=SUBSTRING(T_STUDENT.S_NUMBER,1,
LEN(T_STUDENT.S_NUMBER)-2),
学号=SUBSTRING(T_STUDENT.S_NUMBER,
LEN(T_STUDENT.S_NUMBER)-1,2),
S_NAMEAS姓名,
SEXAS性别,
BIRTHDAYAS出生日期,
POLITYAS政治面貌
FROMT_STUDENT
WHERES_NUMBER=@S_NUMBER
GO
4:
创建一个带有参数的存储过程Stu_Age,该存储过程根据传入的学生编号,在T_STUDENT中计算此学生的年龄,并根据程序的执行结果返回不同的值,程序执行成功,返回整数0,如果执行出错,则返回错误号。
USEStudent_back
IFEXISTS(SELECTnameFROMsysobjects
WHEREname='Stu_Age'ANDtype='P')
DROPPROCEDUREStu_Age
GO
--创建存储过程
USEStudent_back
GO
CREATEPROCEDUREStu_Age
@S_NUMBERvarchar(10),
@AgeintOUTPUT
AS
--定义并初始化局部变量,用于保存返回值
DECLARE@ErrorValueint
SET@ErrorValue=0
--求此学生的年龄
SELECT@Age=YEAR(GETDATE())-YEAR(BIRTHDAY)
FROMT_STUDENT
WHERES_NUMBER=@S_NUMBER
--根据程序的执行结果返回不同的值
IF(@@ERROR<>0)
SET@ErrorValue=@@ERROR
RETURN@ErrorValue
GO
5:
行前面创建的StuInfo存储过程,它是一个无参的存储过程。
USEStudent_back
GO
StuInfo
6:
存储过程StuScoreInfo。
USEStudent_back
EXECStuScoreInfo
7:
执行存储过程Stu_Info,该存储过程有一个输入参数“学号”,在执行时需要传入一个学号值。
USEStudent_back
GO
EXECUTEStu_Info@S_NUMBER='0554101'
8:
执行存储过程Stu_Age,该存储过程有一个输入参数“学号”,另外,还有一个输出参数@Age。
存储过程执行完后,有一个返回的状态值,这个值可以从变量@ErrorValue得到。
USEStudent_back
GO
DECLARE@stuAgeint,
@ReturnValueint,
@S_NUMBERchar(10)
SET@S_NUMBER='0554101'
EXECUTE@ReturnValue=Stu_Age@S_NUMBER,@stuAgeOUTPUT
PRINT'本程序的执行结果:
'
PRINT'程序的返回值='+CAST(@ReturnValueASchar
(2))
PRINT'学号为"'+RTRIM(@S_NUMBER)+'"的学生的年龄是'
+CAST(@stuAgeASchar
(2))+'岁。
'
9:
使用系统存储过程查看Stu_Age存储过程的参数及其数据类型。
USEStudent_back
GO
sp_helpStu_Age
GO
10:
使用系统存储过程查看StuScoreInfo存储过程的相关的数据库对象。
USEStudent_back
GO
sp_dependsStuScoreInfo
GO
11:
修改前面创建的Stu_Info存储过程,使之完成以下功能:
根据传入的学号,在表T_STUDENT、表T_COURSE和表t_SCORE中查询此学生的班级、学号、姓名、性别、考试课程名称和考试分数。
USEStudent_back
GO
ALTERPROCEDUREStu_Info
@S_NUMBERvarchar(10)
AS
Select班级=SUBSTRING(T_STUDENT.S_NUMBER,1,LEN(T_STUDENT.S_NUMBER)-2),
学号=SUBSTRING(T_STUDENT.S_NUMBER,LEN(T_STUDENT.S_NUMBER)-1,2),
T_STUDENT.S_NAMEAS姓名,
SEXAS性别,
T_COURSE.C_NAMEAS课程名称,
SCOREAS考试成绩
FROMT_STUDENT,T_COURSE,t_SCORE
WHERET_STUDENT.S_NUMBER=@S_NUMBER
ANDT_STUDENT.S_NUMBER=t_SCORE.S_NUMBER
ANDT_COURSE.C_NUMBER=t_SCORE.C_NUMBER
GO
--执行修改后的Stu_Info存储过程:
USEStudent_back
GO
EXECStu_Info'0554101'
GO
12:
使用系统存储过程将Stu_Info存储过程的名称修改为Stu_Info_SCORE。
USEStudent_back
GO
Sp_renameStu_Info,Stu_Info_SCORE
GO
13:
使用DROP命令删除StuInfo和StuScoreInfo两个存储过程。
USEStudent_back
GO
DROPprocedureStuInfo,StuScoreInfo
GO
实验五:
触发器的创建和使用
1:
创建一个INSERT触发器“TR_Stu_Insert”,当在T_STUDENT表中插入一条新记录时,触发该触发器,并给出“你插入了一条新记录!
”的提示信息。
--================================================
--TemplategeneratedfromTemplateExplorerusing:
--CreateTrigger(NewMenu).SQL
--
--UsetheSpecifyValuesforTemplateParameters
--command(Ctrl-Shift-M)tofillintheparameter
--valuesbelow.
--
--SeeadditionalCreateTriggertemplatesformore
--examplesofdifferentTriggerstatements.
--
--Thisblockofcommentswillnotbeincludedin
--thedefinitionofthefunction.
--================================================
SETANSI_NULLSON
GO
SETQUOTED_IDENTIFIERON
GO
--=============================================
--Author:
Name
--Createdate:
--Description:
--=============================================
CREATETRIGGERdbo.TR_Stu_Insert
ONdbo.T_STUDENT
AFTERINSERT
AS
BEGIN
--SETNOCOUNTONaddedtopreventextraresultsetsfrom
--interferingwithSELECTstatements.
SETNOCOUNTON;
DECLARE@msgchar(30)
SET@msg='你插入了一条新记录!
'
PRINT@msg
--Insertstatementsfortriggerhere
END
GO
2:
创建了Stu_Insert触发器后,查看向T_STUDENT表中插入数据时,此触发器所完成的功能。
USEStudent_back
GO
insert