广州中医药大学医学信息工程学院
实验报告
课程名称:网络数据库编程
专业班级:计算机科学与技术(2010 )级学生学号:2010081126
学生姓名:吕吕
实验名称:
实验成绩:
课程类别:必修□限选 公选□其它□
实验七游标的使用
实验类型:应用性实验实验日期:
[实验目的]熟悉游标的使用方法
[知识要点]
游标
一个对表进行操作的T-SQL语句通常可产生或处理一组记录,但是有些应用程序往往不需要将结果集作为一个单元来处理,而只是处理一行或几行。SQL SERVER通过游标提供了对一个结果集进行逐行处理的功能。游标可看作是一种特殊的指针,它与某个查询结果相联系,可以指向结果集的任意位置。
游标的基本操作:声明游标->打开游标->提取数据->关闭游标->释放游标。
(1)声明游标
使用游标之前,应当先声明。游标的声明包括两个部分:游标的名称和游标所用的SQL语句。声明游标的语法如下:
DECLARE 游标名称 CURSOR
FOR
说明:
●SELECT语句主要用来定义游标所要进行处理的结果集。在声明游标的
SELECT语句中,不允许使用COMPUTE,COMPUTE BY 和INTO等关键字。
(2)打开游标
声明游标后,正式操作之前,必须打开它。打开游标的语法如下:
OPEN 游标名称
●当执行打开游标的语句时,服务器执行声明游标时使用的select语句,
(3)提取数据
当用OPEN语句打开了游标并在数据库中执行了查询后,并不能立即利用查询结果集中的数据,必须用FETCH语句来提取数据。一条FETCH语句一次可以将一条记录放入指定的变量中。FETCH语句是游标使用的核心。语法格式:FETCH
[[NEXT | PRIOR|FIRST|LAST|ABSOLUTE{n|@nvar}|RELATIVE {n|@nvar}]
FROM] 游标名称
[INTO @变量[,…n]]
说明:
●n和nvar表示游标相对于作为基准的数据行所偏离的位置。
●FIRST:取第一行数据;
LAST: 取最后一行数据;
PRIOR: 取前一行数据;
NEXT: 取后一行数据;
RELATIVE: 按相对位置取数据;
ABSOLUTE: 按绝对位置取数据。
●在使用into子句对变量赋值时,变量的数量和相应的数据类型必须和
声明游标时使用的select语句中引用到的数据列的数目、排列顺序和
数据类型完全保持一致,否则服务器会提示出错。
注意:
●在默认情况下(fetch from 游标名)是表示取下一个数,即
fetch next from 游标名
●游标只能一次从后台数据库中提取一条记录,在多数情况下,所要做的
是在数据库中从第一条记录开始提取,一直到结束。所以一般要将游标
提取数据的语句放在一个循环体内,直到将结果集中的全部数据提取完
后,跳出循环圈。通过检测全局变量@@fetch_status的值,可以得知
fetch语句是否取到最后一条。当@@fetch_status值为0时表明提取正
常,-1表示已经取到了结果集的末尾,而其他值均表明操作出了问题。
●使用游标提取数据的操作要与where循环紧密结合在一起。
(4)关闭游标
在打开游标后,sql server服务器会专门为游标开辟一定的存储空间存放游标操作的数据结果集。在不使用游标的时候,一定要关闭游标,以通知服务器释放标所占的资源。关闭游标的语法如下:
CLOSE 游标名称
说明:
●关闭游标以后,可以再次打开游标。在一个批处理,也可以多次打开
和关闭游标。
(5)释放游标
游标结构本身也会占用一定的计算机资源,所以在使用完游标后,为了回收被游标占用的资源,应该将游标释放。释放游标的语法如下:
DEALLOCATE 游标名称
说明:
当释放游标后,如要重新使用游标必须重新执行声明游标的语句。
[实验内容与要求]
将以下题目的结果文件以题号命名,如题1,题2.。。,放在一个自己的文件夹中。
数据表(student_info)
Sno INT NOT NULL,
Sname CHAR(10) NOT NULL,
Sex CHAR(2) ,
Telephone CHAR(16),
Deptno char(8) NOT NULL ,
SCORE INT
数据表(DEPT_INFO)
DEPTNO char(8) NOT NULL PRIMARY KEY,
DEPTNAME CHAR(20),
DEPTADMIN CHAR(16)
要求:
1.声明一个游标COMPUTER_CURSOR,用以查询计算机系的学生信息。
DECLARE COMPUTER_CURSOR CURSOR FOR
select*from Studentinfo where College='计算机'
2.对声明好的游标COMPUTER_CURSOR,一条条地取出其中的数据。(用WHILE
语句及FETCH NEXT)
open COMPUTER_CURSOR
fetch next from COMPUTER_CURSOR
while@@FETCH_STATUS= 0
BEGIN
FETCH NEXT from COMPUTER_CURSOR
END
close COMPUTER_CURSOR
3.结合存储过程,并使用游标,使用系名传递参数,求出每个系的平均成绩。declare@college varchar(50)
set@college='计算机'
DECLARE Ave_CURSOR CURSOR FOR
select avg(grade)as Avg_grade from StudentInfo
where College=@college
open Ave_CURSOR
FETCH NEXT from Ave_CURSOR
close Ave_CURSOR
4.利用上节课的存储过程proc1(上节课实验第1题:创建存储过程PROC1,
求出学生的学号,姓名,所在系的系名及成绩(不带参数)),通过Callable Statement调用存储过程,将查询结果显示出来。(本题可以参考“Java 调用Sql Server存储过程”文档)
import java.sql.CallableStatement;
import java.sql.*;
public class out1 {
static Connection conn;
private static void getConnect() {
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url="jdbc:odbc:Student";
con=DriverManager.getConnection(url,"lvlv","lvlv"); System.out.println("URL: "+url);
conn = DriverManager.getConnection(url);
}
catch( Exception e )
{
e.printStackTrace();
System.exit(1);
}
}
private static void runthis()
{
CallableStatement cstmt = null;
String str=“DECLARE COMPUTER_CURSOR CURSOR FOR exec Proc1 open COMPUTER_CURSOR
fetch next from COMPUTER_CURSOR
while@@FETCH_STATUS= 0
BEGIN
FETCH NEXT from COMPUTER_CURSOR
END close COMPUTER_CURSOR”;
CallableStatement cstmt = null;
try
{
cstmt = conn.prepareCall (str);
ResultSet rs = cstmt.executeQuery();
while (rs.next())
{
String col1 = rs.getString("StudentNo");
String col2 = rs.getString("StudentName");
String col3=rs.getString("College");
String col4 = rs.getString("grade");
out.println("
+col4+"
}
out.println("");
rs.close();
st.close();
con.close();
} }
catch (SQLException e)
{
e.printStackTrace();
}
}
}
理论题:
5.游标的基本操作有哪些?对应的操作语句是什么?
答:5.1申明游标
DECLARE 游标名[ INSENSITIVE ] [ SCROLL ] CURSOR
FOR sql-statement
打开游标:
OPEN MycrsrVar
5.2读取游标集中的数据
向下读:
FETCH FIRST from E1cursor
或FETCH NEXT from E1cursor
向上读:
Fetch PRIOR from E1cursor
其中关键字Prior为前一行,last为最后一行,Absolute为绝对路径,relative为相对路径
Fetch [Next | Prior | First | Last | Absolute n| Relative
n] From MyCursor Into @GoodsID,@GoodsName
5.3关闭游标
CLOSE { { [ GLOBAL ] 游标名} | 游标变量名}
5.4删除游标
DEALLOCATE { { [ GLOBAL ] 游标名} | @游标变量名
6.@@ FETCH_STATUS不同的值代表的意义是什么?
答:每执行一个FETCH操作之后,通常都要查看一下全局变量@@FETCH_STATUS中的状态值,以此判断FETCH操作是否成功。该变量有三种状态值:
0 表示成功执行FETCH语句。
-1 表示FETCH语句失败,例如移动行指针使其超出了结果集。
-2 表示被提取的行不存在。
[实验体会]
请在下方写出你对本实验的看法,例如你认为实验难度如何?你能够独立实验吗?如果不能,你认为原因是什么?
1、实验难度:难()中等(中等)容易()
2、能否按指定要求,在指定时间内完成所有实验?能(能)否()
如果不能,不能完成实验有
(作业提交说明:实验完成后,将此文档和相关的文件一并压缩后提交上来,文件名为自己的学号+实验七,如2001000001实验七.RAR)