数据库实验报告56次.docx
《数据库实验报告56次.docx》由会员分享,可在线阅读,更多相关《数据库实验报告56次.docx(22页珍藏版)》请在冰豆网上搜索。
数据库实验报告56次
《数据库原理》实验报告
实验名称
学号
姓名
班级
日期
五触发器、存储过程和函数
2013302536
张林江
10011303
2015-10-31
实验五:
触发器、存储过程和函数
1、实验目的
1.掌握系统存储过程的使用用法。
2.掌握用户自定义的存储过程的创建和执行方法。
3.掌握触发器的创建和执行方法。
4.掌握用户自定义函数的创建和执行方法。
2、实验内容
1、使用系统存储过程(sp_rename)将视图“V_SPJ”更名为“V_SPJ_三建”。
(5分)
sp_rename'V_SPJ','VSPJ_三建'
2、针对SPJ数据库,创建并执行如下的存储过程:
(共计35分)
(1)创建一个带参数的存储过程—jsearch。
该存储过程的作用是:
当任意输入一个工程代号时,将返回供应该工程零件的供应商的名称(SNAME)和零件的名称(PNAME)以及工程的名称(JNAME)。
执行jsearch存储过程,查询“J1”对应的信息。
(10分)
CREATEProcedurejsearch(@SPJ_JNOchar(10))
AS
BEGIN
SELECTSNAME,PNAME,JNAME
FROMSPJ,S,P,J
WHERE@SPJ_JNO=SPJ.JNOAND
SPJ.JNO=J.JNOAND
SPJ.PNO=P.PNOAND
SPJ.SNO=S.SNO
END;
输入下边命令,可得到结果
jsearch'J1'
(2)使用S表,为其创建一个加密的存储过程—jmsearch。
该存储过程的作用是:
当执行该存储过程时,将返回北京供应商的所有信息。
(10分)
CREATEPROCjmsearch
WITHENCRYPTION
AS
SELECTS.SNAME,S.SNO,S.STATUS
FROMS
WHERES.CITY='北京'
(3)使用系统存储过程sp_helptext查看jsearch,jmsearch的文本信息。
(5分)
EXECsp_helptextjsearch
EXECsp_helptextjmsearch
因为刚才已经加密,所以无法看见
(4)执行jmsearch存储过程,查看北京供应商的情况。
(5分)
EXECjmsearch
(5)删除jmsearch存储过程。
(5分)
DROPPROCEDURE[dbo].[jmsearch]
3、针对Student数据库,创建和执行如下的触发器:
(共计40分)
(1)删除SC表上的外键约束,针对SC表创建一个名为insert_s的INSERT触发器。
该触发器的功能:
当用户向SC表中插入记录时,如果插入的cno值不是C表中Cno的已有值,则提示用户“不能插入记录这样的纪录”,否则提示“记录插入成功”。
触发器创建成功之后,向SC表插入记录,验证触发器是否正常工作。
(5分)
createtriggerinsert_s
onSC
forinsertas
declare@cnooint
select@cnoofrominserted
if(notexists(select*fromCwhereC.cno=@cnoo))
begin
print'不能插入记录这样的纪录'
end
elseprint'记录插入成功'
insertintoSCvalues('95002','7','100')
(2)为S表创建一个名为dele_s1的DELETE触发器,该触发器的作用是禁止删除S表中的记录。
触发器创建成功之后,删除S表中的记录,验证触发器是否正常工作。
(5分)
CREATEtriggerdele_s1ONS
insteadofdelete
asprint'不能删除S表中记录'
delete
fromS
whereS.sno='95002'
(3)为S表创建一个名为dele_s2的DELETE触发器,该触发器的作用是删除S表中的记录时删除SC表中该学生的选课纪录。
触发器创建成功之后,删除S表中的记录删除S表中的记录,验证触发器是否正常工作(SC表中的数据被正常删除)。
(5分)
createtriggerdele_s2
onS
fordelete
asdelete
fromSC
whereSC.snoin(selectsnofromdeleted)
deletefromswheres.sno='95001'
当再次查询SC表时可见95001已经别删除了
(4)为S表创建一个名为update_s的UPDATE触发器,该触发器的作用是禁止更新S表中“sdept”字段的内容。
触发器创建成功之后,更新S表中“sdept”字段的内容,验证触发器是否正常工作。
(5分)
createtriggerupdate_sonSforupdate
asifupdate(sdept)
begin
print'禁止更新sdept字段'
rollbacktran
end
updateS
setsdept='MA'
wheresno='95002'
(5)禁用update_s触发器。
禁用之后,更新S表中的“sdept”字段的内容,验证触发器是否还继续正常工作。
(5分)
altertableS
disabletriggerupdate_s
updateS
setsdept='MA'
wheresno='95002'
(6)删除update_s触发器。
(5分)
droptriggerupdate_s
(7)创建一个新的课程成绩统计表CAvgGrade(Cno,Snum,examSNum,avgGrade),分别表示课号,选该课程的学生人数,参加考试人数,该门课程的平均成绩。
利用触发器实现如下的功能:
当SC表中有记录插入、删除或者更新时,自动更新表CAvgGrade。
注意SC表中的grade为NULL时表明该学生还未参加考试,计算平均成绩时不需要计算该成绩,但是grade为0即考试成绩为0时,需要计算该成绩。
(10分)
createtableCAvgGrade
(
Cnochar(10),
Snumchar(10),
examSNumchar(10),
avgGradechar(4)
);
初始化Cavggrade表:
A.创建触发器实现功能:
1.创建一个works数据库,其中包含员工表empoyee(eID,eName,salary),假设该表中有1000条员工数据,完成下列要求(总计20分,每题10分)。
(1)为了协助本题自动生成1000条员工数据,创建一个自动生成员工ID的用户自定义函数generateEID。
其中员工ID要求是一个8位的数字,前四位表示插入员工数据的当前年份,后四位按照从0001到9999的顺序增长。
例如2015年插入的第一条数据是20050001,所有1000条员工ID分别是20150001-20151000。
调用该函数实现自动插入1000条数据。
(注意插入数据的时候员工姓名可以为任意值,工资是2000-5000之间的数字)
2.createFUNCTIONgenerateEID
3.(
4.@emp_numint,
5.@yearint
6.)
7.RETURNS@empTable(eIDintprimarykey,eNamechar(20),salaryint)
8.AS
9.BEGIN
10.declare@iint
11.declare@final_idint
12.declare@salaryint
13.declare@namechar(20)
14.set@i=1;
15.set@year=@year*10000;
16.while@i<=@emp_num
17.begin
18.set@final_id=@year+@i
19.set@name='empoyee'+cast(@iasvarchar)
20.set@salary=2000+@i%6*500
21.insertinto@empvalues(@final_id,@name,@salary)
22.set@i=@i+1
23.end
24.return
25.END
使用该自定义函数的返回值创建一个empoyee的表;
CREATE TABLE empoyee
(eID int primary key,
eName char(20),
salary int)
insert into empoyee
select *
from dbo.generateEID(1000,2015)
函数运行之后,empoyee表的数据变成了:
(1)该公司计划为员工按照一定的规则涨工资,请使用游标创建一个存储过程,执行该存储过程完成本次工资调整:
工资增长规则如下:
●工资在3000元以下,每月涨300元;
●工资在3000-4000元之间,每月涨200元;
●工资大于或者等于4000元,每月涨50元;
createprocedureupsalary
as
declare@eidnchar(10)
declare@salaryint
declaremycursorcursorforselecteidfromemployee
openmycursor
fetchnextfrommycursorinto@eid
while(@@FETCH_STATUS=0)
begin
select@salary=salaryfromemployeewhereeid=@eid
if(@salary<3000)
begin
updateemployee
setsalary=@salary+300
whereeid=@eid
end
if(@salary>=3000and@salary<4000)
begin
updateemployee
setsalary=@salary+200
whereeid=@eid
end
if(@salary>=4000)
begin
updateemployee
setsalary=@salary+50
whereeid=@eid
end
fetchnextfrommycursorinto@eid
end
closemycursor
二、实验中出现的问题以及解决方案(对于未解决问题请将问题列出来)
除了标题内容以外,该部分内容中还可以写对于实验的一些感受,建议,意见等。
3.自己的感受
数据库实验还是比较难做的实验,信息量和任务量都很大,在做这次实验之前,我开始看了一下实验的题目,对应着题目,我看了一遍课本,发现仅从课本上的知识是不能全部的做完这次实验,然后我通过查阅参考书,去做预习报告,我发现这次的题目相比于前几次是比较有挑战性的。
比如说对于游标的使用、创建游标、执行带游标的存储过程等等,我在真正敲代码时,都遇到了相应的困难,带式通过咨询老师,查阅资料最终都得到了相应的解决。
批阅者:
批阅日期:
实验成绩:
批注:
《数据库原理》实验报告
实验名称
学号
姓名
班级
日期
六ODBC/JDBC数据库编程
2013302536
张林江
10011303
2015-10-31
实验六:
ODBC/JDBC数据库编程
1、实验目的
1.熟练掌握ODBC数据源的配置方法。
2.掌握ODBC编程技术。
3.掌握JDBC编程技术。
(选做实验)
2、实验内容
1.ODBC配置以及程序调试:
(50分)
(1)配置一个ODBC数据源,要求数据源名称:
student,其中包含s(学生信息)表。
1.点击开始菜单.-->2打开<控制面板>.-3在<调整计算机的设置>中,点击<系统和安全>.--4.点击<管理工具>.--5点击<数据源(ODBC)>.
(2)阅读并运行实验给出的例子程序,理解ODBC编程,要求简单写出自己对这段程序的理解或者流程图,并且请给出程序运行结果示例图。
程序基本思想:
利用ODBC连接数据库Student进行查询。
点击运行按钮,调
CODBC_TESTDlg:
:
OnButtonExcute()函数。
二、实验中出现的问题以及解决方案(对于未解决问题请将问题列出来)
除了标题内容以外,该部分内容中还可以写对于实验的一些感受,建议,意见等。
3.自己的感受
了解了ODBC的编程奥妙,触发器定义对相应数据库带来的便利等等。
通过这次实验,我了解到的学习数据库给我带来的乐趣和编程实现的小小成就感,我感觉自己了解的知识还是很少,应该虚心向老师请教,向同学们学习,多多交流,多看书,更多的锻炼编程,争取有更多的进步。
这次实验整体感觉要难一些,主要是很多东西在书上找不到答案,后来通过与同学讨论在网上查询资料得以解决。
批阅者:
批阅日期:
实验成绩:
批注: