《数据库实验报告5-6次.doc》由会员分享,可在线阅读,更多相关《数据库实验报告5-6次.doc(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 数据库原理实验报告实验名称学号姓名班级日期五 触发器、存储过程和函数2013302536张林江100113032015-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) 创建一个带参数的存储过程jsear
2、ch。该存储过程的作用是:当任意输入一个工程代号时,将返回供应该工程零件的供应商的名称(SNAME)和零件的名称(PNAME)以及工程的名称(JNAME)。执行jsearch存储过程,查询“J1”对应的信息。(10分)CREATE Procedure jsearch(SPJ_JNO char(10)AS BEGIN SELECT SNAME,PNAME,JNAME FROM SPJ,S,P,J WHERE SPJ_JNO = SPJ.JNO AND SPJ.JNO = J.JNO ANDSPJ.PNO = P.PNO ANDSPJ.SNO = S.SNOEND; 输入下边命令,可得到结果jse
3、arch J1 (2)使用S表,为其创建一个加密的存储过程jmsearch。该存储过程的作用是:当执行该存储过程时,将返回北京供应商的所有信息。(10分) CREATE PROC jmsearchWITH ENCRYPTIONASSELECT S.SNAME,S.SNO,S.STATUSFROM SWHERE S.CITY = 北京 (3) 使用系统存储过程sp_helptext查看jsearch, jmsearch的文本信息。(5分)EXEC sp_helptext jsearch EXEC sp_helptext jmsearch 因为刚才已经加密,所以无法看见 (4) 执行jmsearc
4、h存储过程,查看北京供应商的情况。(5分) EXEC jmsearch(5) 删除jmsearch存储过程。(5分)DROP PROCEDURE dbo.jmsearch3、 针对Student数据库,创建和执行如下的触发器:(共计40分)(1) 删除SC表上的外键约束,针对SC表创建一个名为insert_s的INSERT触发器。该触发器的功能:当用户向SC表中插入记录时,如果插入的cno值不是C表中Cno的已有值,则提示用户“不能插入记录这样的纪录”,否则提示“记录插入成功”。触发器创建成功之后,向SC表插入记录,验证触发器是否正常工作。(5分) create trigger insert_
5、s on SCfor insert asdeclare cnoo intselect cnoo from insertedif(not exists(select * from C where C.cno = cnoo)beginprint不能插入记录这样的纪录endelse print记录插入成功insert into SC values(95002,7,100)(2) 为S表创建一个名为dele_s1的DELETE触发器,该触发器的作用是禁止删除S表中的记录。触发器创建成功之后,删除S表中的记录,验证触发器是否正常工作。(5分) CREATE trigger dele_s1 ON Sins
6、tead of deleteas print不能删除S表中记录delete from Swhere S.sno = 95002(3) 为S表创建一个名为dele_s2的DELETE触发器,该触发器的作用是删除S表中的记录时删除SC表中该学生的选课纪录。触发器创建成功之后,删除S表中的记录删除S表中的记录,验证触发器是否正常工作(SC表中的数据被正常删除)。(5分) create trigger dele_s2on S for delete as delete from SC where SC.sno in(select sno from deleted) delete from s where
7、 s.sno=95001当再次查询SC表时可见95001 已经别删除了(4) 为S表创建一个名为update_s的UPDATE触发器,该触发器的作用是禁止更新S表中“sdept”字段的内容。触发器创建成功之后,更新S表中“sdept”字段的内容,验证触发器是否正常工作。(5分)create trigger update_s on S for updateas if update(sdept)beginprint 禁止更新sdept字段rollback tranendupdate S set sdept = MAwhere sno = 95002(5) 禁用update_s触发器。禁用之后,更新
8、S表中的“sdept”字段的内容,验证触发器是否还继续正常工作。(5分)alter table Sdisable trigger update_supdate S set sdept = MAwhere sno = 95002(6) 删除update_s触发器。(5分) drop trigger update_s(7) 创建一个新的课程成绩统计表 CAvgGrade(Cno, Snum, examSNum, avgGrade),分别表示课号,选该课程的学生人数,参加考试人数,该门课程的平均成绩。利用触发器实现如下的功能:当SC表中有记录插入、删除或者更新时,自动更新表CAvgGrade。注意S
9、C表中的grade为NULL时表明该学生还未参加考试,计算平均成绩时不需要计算该成绩,但是grade为0即考试成绩为0时,需要计算该成绩。(10分)create table CAvgGrade( Cno char(10), Snum char(10), examSNum char(10),avgGrade char(4);初始化Cavggrade表: A 创建触发器实现功能: 1. 创建一个works数据库,其中包含员工表empoyee(eID, eName, salary),假设该表中有1000条员工数据,完成下列要求(总计20分,每题10分)。(1) 为了协助本题自动生成1000条员工数据
10、,创建一个自动生成员工ID的用户自定义函数generateEID。其中员工ID要求是一个8位的数字,前四位表示插入员工数据的当前年份,后四位按照从0001到9999的顺序增长。例如2015年插入的第一条数据是20050001,所有1000条员工ID分别是20150001-20151000。调用该函数实现自动插入1000条数据。(注意插入数据的时候员工姓名可以为任意值,工资是2000-5000之间的数字)2 create FUNCTION generateEID3 (4 emp_num int,5 year int6 )7 RETURNS emp Table (eID int primary k
11、ey,eName char(20),salary int)8 AS9 BEGIN10 declare i int11 declare final_id int12 declare salary int13 declare name char(20)14 set i=1;15 set year=year*10000;16 while i =emp_num17 begin18 set final_id =year+i19 set name = empoyee+cast(i as varchar)20 set salary = 2000+i%6 *50021 insert into emp valu
12、es(final_id,name,salary)22 set i=i+123 end24 return25 END使用该自定义函数的返回值创建一个empoyee的表;CREATETABLEempoyee(eIDintprimarykey,eNamechar(20),salaryint)insertintoempoyeeselect*fromdbo.generateEID(1000,2015)函数运行之后,empoyee表的数据变成了: (1) 该公司计划为员工按照一定的规则涨工资,请使用游标创建一个存储过程,执行该存储过程完成本次工资调整:工资增长规则如下:l 工资在3000元以下,每月涨30
13、0元;l 工资在3000-4000元之间,每月涨200元;l 工资大于或者等于4000元,每月涨50元;create procedure upsalaryasdeclare eid nchar(10)declare salary intdeclare mycursor cursor for select eid from employeeopen mycursorfetch next from mycursor into eidwhile(FETCH_STATUS=0)beginselect salary=salary from employee where eid=eidif(salary=
14、3000 and salary=4000)beginupdate employeeset salary=salary+50where eid=eidendfetch next from mycursor into eidendclose mycursor二、实验中出现的问题以及解决方案(对于未解决问题请将问题列出来)除了标题内容以外,该部分内容中还可以写对于实验的一些感受,建议,意见等。3.自己的感受 数据库实验还是比较难做的实验,信息量和任务量都很大,在做这次实验之前,我开始看了一下实验的题目,对应着题目,我看了一遍课本,发现仅从课本上的知识是不能全部的做完这次实验,然后我通过查阅参考书,去
15、做预习报告,我发现这次的题目相比于前几次是比较有挑战性的。比如说对于游标的使用、创建游标、执行带游标的存储过程等等,我在真正敲代码时,都遇到了相应的困难,带式通过咨询老师,查阅资料最终都得到了相应的解决。 批阅者: 批阅日期:实验成绩: 批注: 数据库原理实验报告实验名称学号姓名班级日期六ODBC/JDBC数据库编程2013302536张林江100113032015-10-31实验六:ODBC/JDBC数据库编程1、实验目的1. 熟练掌握ODBC数据源的配置方法。2. 掌握ODBC编程技术。3. 掌握JDBC编程技术。(选做实验)2、实验内容1. ODBC配置以及程序调试:(50分)(1) 配
16、置一个ODBC数据源,要求数据源名称:student,其中包含s(学生信息)表。1.点击开始菜单. - 2打开. -3在中,点击. -4. 点击. - 5点击.(2) 阅读并运行实验给出的例子程序,理解ODBC编程,要求简单写出自己对这段程序的理解或者流程图,并且请给出程序运行结果示例图。 程序基本思想:利用ODBC连接数据库Student进行查询。点击运行按钮,调CODBC_TESTDlg:OnButtonExcute()函数。 二、实验中出现的问题以及解决方案(对于未解决问题请将问题列出来)除了标题内容以外,该部分内容中还可以写对于实验的一些感受,建议,意见等。3.自己的感受 了解了ODBC的编程奥妙,触发器定义对相应数据库带来的便利等等。通过这次实验,我了解到的学习数据库给我带来的乐趣和编程实现的小小成就感,我感觉自己了解的知识还是很少,应该虚心向老师请教,向同学们学习,多多交流,多看书,更多的锻炼编程,争取有更多的进步。这次实验整体感觉要难一些,主要是很多东西在书上找不到答案,后来通过与同学讨论在网上查询资料得以解决。 批阅者: 批阅日期:实验成绩: 批注: