还剩6页未读,继续阅读
文本内容:
实验报告六
(1)课程名称数据库系统原理与应用实验日期
11.21(计科1301ZB)
11.28(计科1101B)实验项目名称数据库编程
(1)实验地点1#609口验证型口设计型实验类型「小人学时2目综合型
一、实验目的及要求(本实验所涉及并要求掌握的知识点)
1、掌握流程控制语句的使用
2、掌握游标、存储过程的定义和使用
二、实验环境(本实验所使用的硬件设备和相关软件)硬件微型计算机Eclipse软件Windows XP操作系统;SQL Server2005数据库管理系统;
三、实验内容及步骤
一、流程控制语句:
1、BEGIN-END包括一系列的Transact-SQL语句,从而可以执行一组Transact-SQL语句语法如下BEGIN(sql_statement}END参数含义如下sql_statement使用语句块定义的任何有效的Transact-SQL语句或语句组
2、IF-ELSE指定Transact-SQL语句的执行条件语法如下IF逻辑表达式sql_statement[ELSE sql_statement]
3、WHILE设置重复执行SQL语句或语句块的条件语法如下WHILE逻辑表达式sql_statement
4、BREAK与CONTINUE可以使用BREAK和CONTINUE关键字在循环内部控制WHILE循环中语句的执行BREAK用于退出最内层的WHILE循环;CONTINUE用于重新开始下一次WHILE循环,在CONTINUE关键字之后的语句都不会被执行,而是跳转到循环开始的地方继续执行
5、流程控制语句举例求100以内的奇数之和declare@num int,@sum intset@num=0set@sum=0while@num100beginset@num=@num+lif@num%2=0continueelseset@sum=@sum+@numendprint@sum
6、WAITFOR语法格式WaitFor{Delay time|time time}例1首先显示学生表的信息,延时10秒钟后再显示课程表的信息use MyDBgselect*from studentgowaitfordelay,00:00:10goselect::from courseGo例
2、在早上八点执行存储过程myproBeginWaitfor time8:00,Exec myproEnd
7、GoToGOTO语句将一个批的执行转到另一个有标号的语句跳过GOTO后面的Transact-SQL语句,并从标号位置继续处理例使用以下语句重新计算从1加到100的值DECLARE@Result int,@n intSET@n=0SET@Result=0Loop_l:/*定义标号*/SET@Result=@Result+@nSET@n=@n+lIF@n=100GOTO loop_l/*如果小于,跳转到loop」标号处列PRINT@Result
8、RETURN从查询或过程中无条件退出语法如下RETURN[integer_expression]参数含义如下integer_expression返回的整数值
9、PRINT向客户端返回用户定义消息语法如下PRINT字符串常量|变量|字符串的表达式例print Iam+a teacher,
10、CASE函数※简单CASE函数CASE表达式1WHEN逻辑表达式1THEN表达式3[…n]ELSE表达式nEND※搜索式CASE函数CASEWHEN逻辑表达式1THEN表达式1[…n][ELSE表达式n]END※简单CASE函数举例select sname姓名,所在系=case sdeptwhen,MS*hen,数学系,when CSthen,计科系,when IS*then信工系,when PSthen物理系,endfrom student※搜索式CASE函数举例select sname,姓名:cname,课程名;casewhen grade89then优秀when grade79and grade90then良好when grade69and grade80then,中等when grade59and grade70then及格else不及格end As成绩级别from student,course,scwhere student.sno=sc.snoand course.cno=sc.cnoand sname=‘李勇’【任务1】
1、求10!o
2、从st数据库中查询所有学生选课成绩情况,包括如下信息姓名、课程名、成绩要求凡是成绩为空者输出“未考”、小于60分的输出“不及格”;60~70分的输出“及格”;70~80分的输出“中”;80~90分的输出“良好”;90~100分的输出“优秀”并且输出记录按下列要求排序先按学号升序,再按课程号升序,最后按成绩降序排序
二、游标一个对表进行操作的T_SQL语句通常都可产生或处理一组记录,但是许多应用程序,通常不能把整个结果集作为一个单元来处理,这些应用程序就需要一种机制来保证每次处理结果集中的一行或几行,游标就提供了这种机制Sql Server通过游标提供了对一个结果集进行逐行处理的能力,游标可看作一种特殊的指针,她与某个查询结果相联系,可以指向结果集的任意位置,以便对指定位置的数据进行处理使用游标可以在查询数据的同时对数据进行处理每一个游标必须有四个组成部分这四个关键部分必须符合下面的顺序;
1.声明游标(DECLARE游标)
2.打开游标(OPEN游标)
3.读取游标中数据(从一个游标中FETCH信息)
4.关闭或删除游标(CLOSE或DEALLOCATE游标)
(1)声明游标其语法格式如下DECLARE cursorname CURSOR[SCROLL]FOR select_statement[FOR{READ ONLY|UPDATE[OF column_name[,...n]]}]其中
①cur sojname指游标的名字
②SCROLL表明所有的提取操作(如FIRST、LAST、PRIOR、NEXT、RELATIVE.ABSOI.UTE)都可用如果不使用该保留字,那么只能进行NEXT提取操作由此可见,SCROLL极大地增加了提取数据的灵活性,可以随意读取结果集中的任一行数据记录,而不必关闭再重开游标
③select statement是定义结果集的SELECT语句
④UPDATE[OF column_name[,•••n]]定义在游标中可被修改的列,如果不指出要更新的列,那么所有的列都将被更新
(2)打开游标声明游标后,要使用游标从中提取数据,就必须先打开游标使用pen语句打开游标其格式为Open游标名打开游标后,可以使用全局变量巡CURSOR_ROWS查看游标中数据行的数目
(3)读取数据其格式为Fetch[next|prior|first|last|absolute n|relativ n]From游标名[Into变量列表]说明:[next|prior|f irst|last|absolute n|relativ n]用于说明读取数据的位置Next说明读取当前行的下一行,并且使其为当前行Prior说明读取当前行的前一行,并且使其为当前行Absolute n如果n为正数,则读取从游标头开始的第n行,并将读取的行变成新的当前行如果n为负数,则读取游标尾之前的第n行,并将读取的行变成新的当前行如果n为3则没有返回行Ralative n如果n为正数,则读取当前行之后的第n行,并将读取的行变成新的当前行如果n为负数,则当前行之前的第n行,并将读取的行变成新的当前行如果n为0,则读取当前行
(4)关闭游标游标使用完毕后要及时关闭关闭游标用Close其格式为Close游标名⑸删除游标游标关闭后,其定义仍在,需要时可用pen语句打开它再使用若确认游标不再需要,就耍释放其定义占用的系统空间,即删除游标删除游标用Deallocate语句其格式为Deallocate游标名
(6)和游标相关的函数
①@@FETCH STATUS返回针对连接当前打开的任何游标发出的上一条游标FETCH语句的状态返回类型integer返回值如下表返回值说明0FETCH语句成功-1FETCH语句失败或行不在结果集中-2提取的行不存在ROWS全局变量@@切1«(烟_醺胭中保存着最后打开的游标中的数据行数当其值为0时,表示没有游标打开;当其值为m(ni为正整数)时,m时游标中的数据行数例1定义一个只可向前读取数据的游标定义declare myfirstcursorcursor forselectsname.cname,grade fromstudentcourse,sc wherestudent.sno=sc.sno andcourse.cno=sc.cno打开open myfirstcursorgo读取fetch nextfrom myfirstcursorGo关闭游标close myfirstcursor删除游标deallocate myfirstcursor例2定义一个可以向任意位置读取数据的游标declare mysecondcursorcursorscrollforselect sname.cname,gradefrom student,course,scwhere student.sno=sc.snoand course.cno=sc.cno打开open mysecondcursorgo读取fetch nextfrom mysecondcursorGo按绝对位置读取fetch absolute3from mysecondcursor按相对位置读取fetch relative-2from mysecondcursor读取最后一条记录fetch lastfrom mysecondcursorgo关闭游标close mysecondcursor删除游标deallocate mysecondcursor例3定义一个可以向任意位置读取数据的游标,利用游标逐个读取数据定义declare mythirdcursorcursorscrollforselect sname.cname,gradefrom studentcourse,scwhere student.sno=sc.snoand course.cno=sc.cnogo打开Open mythirdcursorgo读取fetch firstfrom mythirdcursorgowhile@@fetch_status-1fetch nextfrom mythirdcursor关闭Close mythirdcursor删除Deallocate mythirdcursor[任务2]在st数据库中完成以下作业
(1)利用游标查找所有计科系的学生信息
(2)定义可以向任意位置读取数据的游标,显示学生姓名、选修的门数、和平均成绩并顺序逐个读取其中的数据然后分别显示第3条记录,第1条记录和最后1条记录
(3)创建一游标,逐行显示Student表中的记录,要求按‘学号+--------------------+姓名+,------------+,性别+,-------------+所在系格式输出
三、存储过程存储过程类似一个函数定义存储过程的语法(详细语法可以参考SQL Server联机丛书)CREATE PROC[EDURE]存储过程名@参数1数据类型二默认值OUTPUT,@参数n数据类型二默认值OUTPUT ASSQL语句GO和C语言的函数一样,参数可选参数分为输入参数、输出参数输入参数允许有默认值设计1(无默认值无输出型)CREATE PROCEDUREproc_stu@testgrade int一成绩ASprint,查询成绩高于给定成绩的学生成绩信息’SELECT sname学生姓名.cname课程名、grade成绩from StudenLcourse.scwhere student.sno=sc.snoand course.cno=sc.cnoand grade@testgrade GO调用exec proc_stu80设计2(有默认值有输出型)CREATE PROCEDUREproc stul@count intOUTPUT,@sdept char(2尸cs ASSELECTsdept所在系,FROM studentWheresdept=@sdeptGroup bysdeptSELECT@count二count(*)FROM studentWheresdept=@sdeptGroup bysdept GO调用—调用存储过程一一*/DECLARE@c intEXECproc_stul@c OUTPUT.MA1--要指定输出变量名和OUTPUT参数select@c【任务3】基于ST数据库,创建下面的存储过程
1、利用学生姓名查询该生选修的课程名和成绩
2、利用课程名查询该选修该课程的人数、平均分、最高分和最低分
四、实验结果(本实验源程序清单及运行结果或实验结论、实验设计图)
五、实验总结(对本实验结果进行分析,实验心得体会及改进意见)实验评语实验成绩指导教师签名2013年11月29日。
个人认证
优秀文档
获得点赞 0