| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1170 人关注过本帖
标题:游标是怎么回事
只看楼主 加入收藏
ca2ju3
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2005-6-10
收藏
 问题点数:0 回复次数:7 
游标是怎么回事
游标具体是用来干什么的
跟临时表,存储过程有什么不同,
合用的时候有什么效果
能举几个例子吗
谢谢!
搜索更多相关主题的帖子: 游标 效果 例子 
2006-03-22 18:27
卜酷塔
Rank: 7Rank: 7Rank: 7
来 自:魅力青岛
等 级:禁止访问
威 望:39
帖 子:2569
专家分:0
注 册:2004-6-12
收藏
得分:0 

Transact-SQL 游标

Transact-SQL 游标主要用在存储过程、触发器和 Transact-SQL 脚本中,它们使结果集的内容对其它 Transact-SQL 语句同样可用。

在存储过程或触发器中使用 Transact-SQL 游标的典型进程为:

  1. 声明 Transact-SQL 变量包含游标返回的数据。为每一结果集列声明一个变量。声明足够大的变量以保存由列返回的值,并声明可从列数据类型以隐性方式转换得到的数据类型。

  2. 使用 DECLARE CURSOR 语句把 Transact-SQL 游标与一个 SELECT 语句相关联。DECLARE CURSOR 语句同时定义游标的特征,比如游标名称以及游标是否为只读或只进特性。

  3. 使用 OPEN 语句执行 SELECT 语句并生成游标。

  4. 使用 FETCH INTO 语句提取单个行,并把每列中的数据转移到指定的变量中。然后,其它 Transact-SQL 语句可以引用这些变量来访问已提取的数据值。Transact-SQL 不支持提取行块。

  5. 结束游标时,使用 CLOSE 语句。关闭游标可以释放某些资源,比如游标结果集和对当前行的锁定,但是如果重新发出一个 OPEN 语句,则该游标结构仍可用于处理。由于游标仍然存在,此时还不能重新使用游标的名称。DEALLOCATE 语句则完全释放分配给游标的资源,包括游标名称。在游标被释放后,必须使用 DECLARE 语句来重新生成游标。
监视 Transact-SQL 游标的活动

可以使用 sp_cursor_list 系统存储过程来获得对当前连接可见的游标列表,使用sp_describe_cursorsp_describe_cursor_columnssp_describe_cursor_tables 来确定游标的特征。

在游标打开后,@@CURSOR_ROWS 函数或由 sp_cursor_listsp_describe_cursor 返回的 cursor_rows 列会指出游标中的行数。

在每个 FETCH 语句执行之后,@@FETCH_STATUS 更新以反映最后一次提取的状态。也可以从由 sp_describe_cursor 返回的 fetch_status 列中获取该状态信息。@@FETCH_STATUS 报告游标中的状态,比如超出第一行和最后一行的提取。@@FETCH_STATUS 对于连接来说是全局性的,并在连接游标打开时由每次提取进行重置。如果必须在以后了解状态,就需要在连接中执行另外一个语句之前,把 @@FETCH_STATUS 保存在一个用户变量中。即使下一语句不是 FETCH,也可能是 INSERT、UPDATE 或 DELETE 这些语句,它们能够激发包含可重置 @@FETCH_STATUS 的 FETCH 语句的触发器。sp_describe_cursor 返回的 fetch_status 列对于指定的游标来说是确定的,不受那些引用其它游标的 FETCH 语句的影响,但 sp_describe_cursor 会受引用相同游标的 FETCH 语句的影响,因此使用时必须注意。

完成 FETCH 后,游标将定位在已提取的行上。被提取的行称为当前行。如果游标没有声明为只读游标,就可以执行带有 WHERE CURRENT OF cursor_name 子句的 UPDATE 或 DELETE 语句来修改当前行。

由 DECLARE CURSOR 语句赋给 Transact-SQL 游标的名称可以是全局或局部的。全局游标的名称可由任何位于同一连接上的批处理、存储过程或触发器引用。局部游标名称不能在声明游标的批处理、存储过程或触发器之外被引用。触发器和存储过程中的局部游标因而可以避免来自存储过程或触发器外部的无意引用。

使用游标变量

Microsoft® SQL Server™ 2000 也支持 cursor 数据类型的变量。游标可以有两种方法与一个 cursor 变量相关联:

/* Use DECLARE @local_variable, DECLARE CURSOR and SET. */
DECLARE @MyVariable CURSOR

DECLARE MyCursor CURSOR FOR
SELECT LastName FROM Northwind.dbo.Employees

SET @MyVariable = MyCursor

/* Use DECLARE @local_variable and SET */
DECLARE @MyVariable CURSOR

SET @MyVariable = CURSOR SCROLL KEYSET FOR
SELECT LastName FROM Northwind.dbo.Employees

当游标与 cursor 变量相关联之后,在 Transact-SQL 游标语句中就可以使用 cursor 变量代替游标名称。存储过程输出参数也可指派为 cursor 数据类型,并与一个游标相关联。这就允许存储过程有节制地展示其局部游标。

引用 Transact-SQL 游标

Transact-SQL 游标名称和变量只能由 Transact-SQL 语句引用,而不能由 OLE DB、ODBC、ADO 和 DB-Library 的 API 函数引用。例如,如果要使用 DECLARE CURSOR 和 OPEN 语句生成一个 Transact-SQL 游标,就无法使用 SQLFetchSQLFetchScroll 函数来从 Transact-SQL 游标中提取行。需要游标处理而又使用这些 API 的应用程序应该使用数据库 API 中内建的游标支持代替 Transact-SQL 游标。

通过使用 FETCH 并绑定由 FETCH 返回给程序变量的每一列,可以在应用程序中使用 Transact-SQL 游标。Transact-SQL FETCH 不支持批处理,因此,这是将数据返回给应用程序的效率最低的方法。每提取一行均需往返服务器一次。使用内建在数据库 API 中的游标功能更为有效,可进行多行提取。

当包含在存储过程和触发器中时,Transact-SQL 游标极其有效。这是因为所有操作都编译到服务器上的一个执行计划内,不存在与行提取有关的网络流量。


觉得为时已晚的时候,恰恰是最早的时候。

2006-03-23 11:07
houjunli
Rank: 2
等 级:新手上路
威 望:5
帖 子:346
专家分:0
注 册:2006-2-16
收藏
得分:0 
顶一下-好-说的真详细

2006-03-23 11:20
ca2ju3
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2005-6-10
收藏
得分:0 
谢谢~!
2006-03-23 12:06
makebest
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:3
帖 子:658
专家分:962
注 册:2005-3-17
收藏
得分:0 
呵呵,完全是从联机丛书里的复制的,所以大家要学会自己查“联机丛书”啊!
2006-03-23 14:16
卜酷塔
Rank: 7Rank: 7Rank: 7
来 自:魅力青岛
等 级:禁止访问
威 望:39
帖 子:2569
专家分:0
注 册:2004-6-12
收藏
得分:0 

you are very clever,

that is copy from online book


觉得为时已晚的时候,恰恰是最早的时候。

2006-03-23 15:16
qiaozhiwei
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-3-22
收藏
得分:0 

游标

关系数据库中的操作会对整个行集产生影响。由 SELECT 语句返回的行集包括所有满足该语句 WHERE 子句中条件的行。由语句所返回的这一完整的行集被称为结果集。应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理。这些应用程序需要一种机制以便每次处理一行或一部分行。游标就是提供这种机制的结果集扩展。

游标通过以下方式扩展结果处理:

  • 允许定位在结果集的特定行。

  • 从结果集的当前位置检索一行或多行。

  • 支持对结果集中当前位置的行进行数据修改。

  • 为由其他用户对显示在结果集中的数据库数据所做的更改提供不同级别的可见性支持。

  • 提供脚本、存储过程和触发器中使用的访问结果集中的数据的 Transact-SQL 语句。
请求游标

Microsoft® SQL Server™ 2000 支持两种请求游标的方法:

  • Transact-SQL

    对根据 SQL-92 游标语法制定的游标,Transact-SQL 语言支持使用它们的语法。

  • 数据库应用程序编程接口(API)游标函数

    SQL Server 支持这些数据库 API 的游标功能:

    • ADO(Microsoft ActiveX® 数据对象)

    • OLE DB

    • ODBC(开放式数据库连接)

    • DB-Library

应用程序不能混合使用这两种请求游标的方法。已经使用 API 指定游标行为的应用程序不能再执行 Transact-SQL DECLARE CURSOR 语句请求一个 Transact-SQL 游标。只有在将所有 API 游标特性均设回默认值后,应用程序才可以执行 DECLARE CURSOR。

如果 Transact-SQL 和 API 游标均未被请求,则默认情况下 SQL Server 将一个完整的结果集返回给应用程序,这个结果集称为默认结果集

游标进程

Transact-SQL 游标和 API 游标有不同的语法,但下列一般进程可用于所有 SQL Server 游标:

  1. 把游标与 Transact-SQL 语句的结果集相关联,并且定义游标的特征,如是否能够更新游标中的行。

  2. 执行 Transact-SQL 语句以填充游标。

  3. 检索想要查看的游标中的行。从游标中检索一行或多行的操作称为提取。执行一系列的提取操作以向前或向后检索行的操作称为滚动。

  4. 根据需要,对游标中当前位置的行执行修改操作(更新或删除)。

  5. 关闭游标。
2006-03-23 17:08
自由震魂曲
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2006-3-10
收藏
得分:0 
......我自己的一些理解
游标在我的理解就是一个指针,首先它指向你所查询得到的结果的第一行,你可以对这一行所有的列值做操作,然后是循环指向下一行.直到所有结果行遍历一遍.

临时表是一种表的类别,存储过程是一个可执行的一系列SQL语句的集合,游标是个帮助操作的工具.三者从类别上来看没什么关系.但在存储过程中会用到临时表还有游标.

我没有现成的例子给你.不过在存储过程中,临时表和游标都很常见.所以建议你去看看数据库中的存储过程.

2006-03-23 17:44
快速回复:游标是怎么回事
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026379 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved