数据库实验报告记录三DOC.docx
《数据库实验报告记录三DOC.docx》由会员分享,可在线阅读,更多相关《数据库实验报告记录三DOC.docx(26页珍藏版)》请在冰豆网上搜索。
![数据库实验报告记录三DOC.docx](https://file1.bdocx.com/fileroot1/2023-1/23/18efd675-05c9-4d32-9db5-d06081a583f7/18efd675-05c9-4d32-9db5-d06081a583f71.gif)
数据库实验报告记录三DOC
数据库实验报告记录三(DOC)
————————————————————————————————作者:
————————————————————————————————日期:
《数据库原理》实验报告
实验五:
触发器、存储过程和函数
实验六:
ODBC/JDBC数据库编程
学号
姓名
班级
日期
2013302534
杨添文
10011303
2015.10.31
实验五:
触发器、存储过程和函数
一、实验内容
1.使用系统存储过程(sp_rename)将视图“V_SPJ”更名为“V_SPJ_三建”。
(5分)
(1)在原有数据库SPJ中,建立如下语句:
execsp_rename'V_SPJ','V_SPJ三建'
(2)结果为:
2.针对SPJ数据库,创建并执行如下的存储过程:
(共计35分)
(1)创建一个带参数的存储过程—jsearch。
该存储过程的作用是:
当任意输入一个工程代号时,将返回供应该工程零件的供应商的名称(SNAME)和零件的名称(PNAME)以及工程的名称(JNAME)。
执行jsearch存储过程,查询“J1”对应的信息。
(10分)
(1)存储过程为:
createprocedurejsearch(@searchingfor_jnonchar(20))
as
begin
selectJ.JNAME,S.SNAME,P.PNAME
fromS,P,J,SPJ
where
SPJ.JNO=@searchingfor_jnoandSPJ.JNO=J.JNOandSPJ.SNO=S.SNOandSPJ.PNO=P.PNO
End
use[SPJ]
go
(2)执行存储过程如下:
declare@solutionint
exec@solution=[dbo].[jsearch]
@searchingfor_jno=N'J1'
select'solution'=@solution
go
(3)结果:
(2)使用S表,为其创建一个加密的存储过程—jmsearch。
该存储过程的作用是:
当执行该存储过程时,将返回北京供应商的所有信息。
(10分)
createprocedurejmsearch
withencryption
as
begin
select*
fromS
whereCITY='北京'
end
(3)使用系统存储过程sp_helptext查看jsearch,jmsearch的文本信息。
(5分)
(1)当输入为:
execsp_helptext'jsearch'
结果是:
(2)当输入为:
execsp_helptext'jmsearch'
结果是:
(4)执行jmsearch存储过程,查看北京供应商的情况。
(5分)
(1)执行存储过程:
use[SPJ]
go
declare@solutionint
exec@solution=[dbo].[jmsearch]
select'solution'=@solution
go
(2)结果为:
(5)删除jmsearch存储过程。
(5分)
dropprocedurejmsearch
3.针对Student数据库,创建和执行如下的触发器:
(共计40分)
(1)删除SC表上的外键约束,针对SC表创建一个名为insert_s的INSERT触发器。
该触发器的功能:
当用户向SC表中插入记录时,如果插入的cno值不是C表中Cno的已有值,则提示用户“不能插入记录这样的纪录”,否则提示“记录插入成功”。
触发器创建成功之后,向SC表插入记录,验证触发器是否正常工作。
(5分)
(1)创建触发器:
usestudent
go
createtriggerinsert_s
onsc
afterinsert
as
if(exists(
select*frominserted
wherecno!
='1'orcno!
='2'orcno!
='3'orcno!
='6')
)
begin
print'不能插入记录这样的纪录'
rollbacktransaction
end
else
print'记录插入成功'
(2)验证:
usestudent
go
insertinto
sc(sno,cno,grade)
values('95001','5','88')
结果:
(2)为S表创建一个名为dele_s1的DELETE触发器,该触发器的作用是禁止删除S表中的记录。
触发器创建成功之后,删除S表中的记录,验证触发器是否正常工作。
(5分)
(1)创建触发器:
usestudent
go
createtriggerdele_s1
ons
afterdelete
as
rollbacktransaction
print'不能删除表中纪录'
go
(2)验证:
当要删除表中记录时,出现如下图所示情况
(3)为S表创建一个名为dele_s2的DELETE触发器,该触发器的作用是删除S表中的记录时删除SC表中该学生的选课纪录。
触发器创建成功之后,删除S表中的记录,验证触发器是否正常工作(SC表中的数据被正常删除)。
(5分)
(1)创建触发器:
usestudent
go
createtriggerdele_s2
ons
fordelete
as
deletefromsc
wheresc.snoin
(
selectsnofromdeleted
)
(2)验证:
(前提:
删除触发器dele_s1,否则不能删除S表记录)
deletefroms
wheres.sno='95001'
select*fromsc
结果为:
(4)为S表创建一个名为update_s的UPDATE触发器,该触发器的作用是禁止更新S表中“sdept”字段的内容。
触发器创建成功之后,更新S表中“sdept”字段的内容,验证触发器是否正常工作。
(5分)
(1)创建触发器:
usestudent
go
createtriggerupdate_s
ons
afterupdate
as
ifupdate(sdept)
begin
raiserror('sdept不能被更改',10,1)
rollbacktransaction
end
(2)验证:
当要进行数据更改时,出现如下图所示情况:
(5)禁用update_s触发器。
禁用之后,更新S表中的“sdept”字段的内容,验证触发器是否还继续正常工作。
(5分)
(1)禁用触发器:
usestudent
go
disabletriggerupdate_s
ons
go
(2)验证:
已经将“MA”更改为“IS”,如下图所示:
(6)删除update_s触发器。
(5分)
usestudent
go
droptriggerupdate_s
go
(7)创建一个新的课程成绩统计表CAvgGrade(Cno,Snum,examSNum,avgGrade),分别表示课号,选该课程的学生人数,参加考试人数,该门课程的平均成绩。
利用触发器实现如下的功能:
当SC表中有记录插入、删除或者更新时,自动更新表CAvgGrade。
注意SC表中的grade为NULL时表明该学生还未参加考试,计算平均成绩时不需要计算该成绩,但是grade为0即考试成绩为0时,需要计算该成绩。
(10分)
(1)创建统计表CAvgGrade:
createtableCAvgGrade
(
cnochar(10)primarykey,
snumint,
examsnumint,
avggradefloat
)
(2)创建触发器:
usestudent
go
createtriggerupd_ins_dele_CAvgGrade
onsc
afterupdate,insert,delete
as
begin
declare@cnochar(10)
declare@snumint
declare@examsumint
declare@avggradeint
select@cno=cnofrominserted
select@cno=cnofromdeleted
select@snum=COUNT(*)fromscwhere@cno=cno
select@examsum=COUNT(*)fromscwhere@cno=cnoandgrade>=0
select@avggrade=AVG(grade)fromscwhere@cno=cnoandgrade>=0
updateCAvgGrade
set
snum=@snum,cno=@cno,examsnum=@examsum,avggrade=@avggrade
wherecno=@cno
end
(3)测试:
A、(测试插入)
usestudent
go
insertintosc
values('95005','1',88)
结果为:
(CAvgGrade表)
(sc表)
B、(测试删除)
usestudent
go
deletefromsc
wherecno='1'
结果为:
(CAvgGrade表)
(sc表)
C、(测试更改)
updatesc
setgrade=99
wherecno='1'
结果为:
(CAvgGrade表)
(sc表)
4.创建一个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之间的数字)
(1)自定义:
useworks
go
createproceduregenerateEID
as
begin
declare@forint
set@for=0
while(@for<1000)
begin
insertinto
employee
values(20050001+@for,'name'+CAST(@forasNCHAR(20)),2000+CAST(FLOOR(rand()*3001)asint))
set@for=@for+1
end
end
useworks
go
DECLARE@return_valueint
EXEC@return_value=[dbo].[generateEID]
SELECT'ReturnValue'=@return_value
GO
(2)结果:
(2)该公司计划为员工按照一定的规则涨工资,请使用游标创建一个存储过程,执行该存储过程完成本次工资调整:
工资增长规则如下:
●工资在3000元以下,每月涨300元;
●工资在3000-4000元之间,每月涨200元;
●工资大于或者等于4000元,每月涨50元;
(1)语句如下:
declaremycursorcursorfor
selectsalaryfromempoyee
openmycursor
declare@salaryint
fetchnextfrommycursorinto@salary
while@@FETCH_STATUS=0
begin
if(@salary<3000)
begin
updateempoyeesetsalary=@salary+300wherecurrentofmycursor
end
elseif(@salary<4000)
begin
updateempoyeesetsalary=@salary+200wherecurrentofmycursor
end
else
begin
updateempoyeesetsalary=@salary+50wherecurrentofmycursor
end
fetchnextfrommycursorinto@salary
end
closemycursor
deallocatemycursor
(2)结果如下:
二、实验反思
触发器是对表进行插入、更新、删除的时候会自动执行的特殊存储过程,本章学习的触发器类型是after触发器,即只有当执行update,delete,insert的时候这个触发器才会被使用到,触发器的使用为数据库操作真的提供了很多便利。
实验六:
ODBC/JDBC数据库编程
一、实验内容
1.ODBC配置以及程序调试:
(50分)
(1)配置一个ODBC数据源,要求数据源名称:
student,其中包含s(学生信息)表。
1、设置属性:
2、更改默认数据库:
3、测试数据源:
4、测试成功:
5、结果为:
(2)阅读并运行实验给出的例子程序,理解ODBC编程,要求简单写出自己对这段程序的理解或者流程图,并且请给出程序运行结果示例图。
一、对程序的流程的理解以下面的步骤展开:
1、定义句柄跟变量。
其中句柄有环境句柄、连接句柄、语句句柄;
2、初始化环境
(1)分配环境句柄;
(2)设置管理环境属性;
(3)连接数据库。
3、建立连接
(1)分配连接句柄;
(2)连接若失败则返回错误值。
4、初始化语句句柄。
设置了语句选项。
5、执行语句
(1)预编译带有参数语句;
(2)预先声明插入语句;
(3)执行SQL语句。
6、处理结果集合的同时执行预编译后的语句。
7、中止处理
(1)释放语句句柄;
(2)释放环境句柄;
(3)断开连接。
二、运行结果:
点了“执行”之后:
2.参考给出的ODBC编程示例,使用ODBC技术,编写一个简单的程序,包含对数据库SPJ的连接,查询,插入,修改和删除。
(50分)
(1)插入数据:
代码:
insertintoSvalues('95005','刘鹏飞','男','1992-05-16','IS')
结果为:
(2)删除数据:
代码:
deletefromSwhereSname='刘鹏飞'
结果为:
3.用JDBC实现对数据库student的连接,查询,插入,修改和删除。
(选做实验)
(1)插入数据:
(2)删除数据:
(3)数据的查询:
二、实验反思
ODBC是一种使用SQL的程序设计接口,这次实验主要就是利用ODBC编程,使用ODBC让应用程序的编写者避免了与数据源相联的复杂性,很不错的一种技术,但是要利用C++程序编写时显得能力不足,因为涉及的方面太广了,语言很复杂,经过老师给的例子程序才勉强理解一些,后来看了很多博客才渐渐有一些眉目。