数据库实验报告记录三DOC.docx

上传人:b****6 文档编号:7390376 上传时间:2023-01-23 格式:DOCX 页数:26 大小:789.66KB
下载 相关 举报
数据库实验报告记录三DOC.docx_第1页
第1页 / 共26页
数据库实验报告记录三DOC.docx_第2页
第2页 / 共26页
数据库实验报告记录三DOC.docx_第3页
第3页 / 共26页
数据库实验报告记录三DOC.docx_第4页
第4页 / 共26页
数据库实验报告记录三DOC.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

数据库实验报告记录三DOC.docx

《数据库实验报告记录三DOC.docx》由会员分享,可在线阅读,更多相关《数据库实验报告记录三DOC.docx(26页珍藏版)》请在冰豆网上搜索。

数据库实验报告记录三DOC.docx

数据库实验报告记录三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++程序编写时显得能力不足,因为涉及的方面太广了,语言很复杂,经过老师给的例子程序才勉强理解一些,后来看了很多博客才渐渐有一些眉目。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1