设为首页 收藏本站
查看: 838|回复: 0

[经验分享] sql server 2000/2005 游标的使用操作

[复制链接]

尚未签到

发表于 2015-7-4 13:31:16 | 显示全部楼层 |阅读模式
引用地址: http://hi.baidu.com/aaxh/blog/item/6d4863590b74a4292834f0db.html
1. 定义游标定义
游标语句的核心是定义了一个游标标识名,并把游标标识名和一个查询语句关联起来。DECLARE语句用于声明游标,它通过SELECT查询定义游标存储的数据集合。语句格式为:
DECLARE 游标名称 [INSENSITIVE] [SCROLL]
CURSOR FOR select语句
[FOR{READ ONLY|UPDATE[OF 列名字表]}]
参数说明:
INSENSITIVE选项:说明所定义的游标使用SELECT语句查询结果的拷贝,对游标的操作都基于该拷贝进行。因此,这期间对游标基本表的数据修改不能反映到游标中。这种游标也不允许通过它修改基本表的数据。
SCROLL选项:指定该游标可用所有的游标数据定位方法提取数据,游标定位方法包括PRIOR、FIRST、LAST、ABSOLUTE n 和RELATIVE n 选项。
Select语句:为标准的SELECT查询语句,其查询结果为游标的数据集合,构成游标数据集合的一个或多个表称作游标的基表。
在游标声明语句中,有下列条件之一时,系统自动把游标定义为INSENSITIVE游标:
SELECT语句中使用了DISTINCT、UNION、 GROUP BY或HAVING等关键字;
任一个游标基表中不存在唯一索引。
其他
READ ONLY选项:说明定义只读游标。
UPDATE [OF 列名字表]选项:定义游标可修改的列。如果使用OF 列名字表选项,说明只允许修改所指定的列,否则,所有列均可修改。
例如,查询教师名字和所教的课程名,定义游标TCURSOR的语句如下 :
DECLARE TCURSOR CURSOR FOR
SELECT tname, cname
FROM teacher ,couse
WHERE teacher.tno = couse.tno
2. 打开游标
打开游标语句执行游标定义中的查询语句,查询结果存放在游标缓冲区中。并使游标指针指向游标区中的第一个元组,作为游标的缺省访问位置。查询结果的内容取决与查询语句的设置和查询条件。
打开游标的语句格式:
EXEC SQL OPEN 〈游标名〉
如果打开的游标为INSENSITIVE游标,在打开时将产生一个临时表,将定义的游标数据集合从其基表中拷贝过来。
SQL Server中,游标打开后,可以从全局变量@@CURSOR_ROWS中读取游标结果集合中的行数。
例1:打开前面所创建的查询教师姓名和所教课名称的游标。
OPEN tcursor
例2:显示游标结果集合中数据行数
SELECT 数据行数 = @@CURSOR_ROWS

3. 读游标区中的当前元组
读游标区数据语句是读取游标区中当前元组的值,并将各分量依次赋给指定的共享主变量。FETCH语句用于读取游标中的数据,语句格式为:
FETCH [[NEXT|PRIOR|FIRST|LAST| ABSOLUTE n| RELATIVE n]
FROM ] 游标名
[INTO @变量1, @变量2, ….]
其中:
NEXT:说明读取游标中的下一行,第一次对游标实行读取操作时,NEXT返回结果集合中的第一行。
PRIOR、FIRST、LAST、ABSOLUTE n 和RELATIVE n 选项只适用于SCROLL游标。它们分别说明读取游标中的上一行、第一行、最后一行、第n 行和相对于当前位置的第n 行。n 为负值时,ABSOLUTE n 和RELATIVE n 说明读取从游标结果集合中的最后一行或当前行倒数n行的数据。
INTO子句 说明将读取的数据存放到指定的局部变量中,每一个变量的数据类型应与游标所返回的数据类型严格匹配,否则将产生错误。
如果游标区的元组已经读完,那么系统状态变量SQLSTATE的值被设为02000,意为"no tuple found"。
例如,读取tcursor中当前位置后的第二行数据
FETCH RELATIVE 2 FROM tcursor

4. 利用游标修改数据
SQL Server中的 UPDATE语句 和 DELETE语句也支持游标操作,它们可以通过游标修改或删除游标基表中的当前数据行。
UPDATE语句的格式为:
UPDATE table_name
SET 列名=表达式}[,…n]
WHERE CURRENT OF cursor_name
DELETE语句的格式为:
DELETE FROM table_name
WHERE CURRENT OF cursor_name
说明:
CURRENT OF cursor_name:
表示当前游标指针所指的当前行数据。CURRENT OF 只能在UPDATE和DELETE语句中使用。
注意:
o使用游标修改基表数据的前提是声明的游标是可更新的。
o 对相应的数据库对象(游标的基表)有修改和删除权限。
5. 关闭游标
关闭游标后,游标区的数据不可再读。CLOSE语句关闭已打开的游标,之后不能对游标进行读取等操作,但可以使用OPEN语句再次打开该游标。
CLOSE语句的格式为:
CLOSE 游标名
例如:关闭tcursor游标如下描述:
CLOSE tcursor

6 删除游标语句
DEALLOCATE语句删除定义游标的数据结构,删除后不可再用。语句格式:
DEALLOCATE 游标名
例如,删除tcursor游标
DEALLOCATE tcursor

例1,读JS2001班的学生的学号和姓名:
#define MAX 30
EXEC SQL BEGIN DECLARE SECTION;
char TN[12], FU[20]; //定义主变量//
EXEC SQL END DECLARE SECTION;
char tarn1[30][12],tarn2[30][20]; //定义 C 变量//
. . . . . .
EXEC SQL //执行SQL语句,定义游标//
DCLARE Scursor CURSOR FOR //声明游标Scursor//
SELECT sno,sname //查询sno,sname//
FROM student //对student表chax 查询//
WHERE sclass = 'JS2001'; //sclass='JS2001'的班级//
EXEC SQL OPEN Scursor ; //打开游标//
for (i=0; i

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-83100-1-1.html 上篇帖子: 免费SQL Server 2005教程 (截止到2005-9-1) 下篇帖子: 揭秘SQL Server 2000中的Bookmark Lookup
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表