关系数据库中的操作会对整个行集产生影响。由 SELECT 语句返回的行集包括所有满足该语句 WHERE 子句中条件的行。由语句所返回的这一完整的行集被称为结果集。应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理。这些应用程序需要一种机制以便每次处理一行或一部分行。游标就是提供这种机制的结果集扩展。
游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。
游标通过以下方式扩展结果处理:
- 允许定位在结果集的特定行。
- 从结果集的当前位置检索一行或多行。
- 支持对结果集中当前位置的行进行数据修改。
- 为由其他用户对显示在结果集中的数据库数据所做的更改提供不同级别的可见性支持。
- 提供脚本、存储过程和触发器中使用的访问结果集中的数据的 Transact-SQL 语句。
请求游标
Microsoft SQL Server 2005 支持两种请求游标的方法:
· Transact-SQL
Transact-SQL 语言支持使用根据 SQL-92 游标语法制定的游标的语法。
· 数据库应用程序编程接口(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 游标:
- 把游标与 Transact-SQL 语句的结果集相关联,并且定义游标的特征,如是否能够更新游标中的行。
- 执行 Transact-SQL 语句以填充游标。
- 检索想要查看的游标中的行。从游标中检索一行或多行的操作称为提取。执行一系列的提取操作以向前或向后检索行的操作称为滚动。
- 根据需要,对游标中当前位置的行执行修改操作(更新或删除)。
- 关闭游标。
声明游标:
DECLARE 游标名字 [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR select 语句
[ FOR { READ ONLY | UPDATE [ OF 列名 [ ,...n ] ] } ]
参数:
SCROLL 选项:指定所有的提取(fetch)选项(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)均可用。如果在 SQL-92 DECLARE CURSOR 中未指定 SCROLL,则 NEXT 是唯一支持的提取选项。如果指定 SCROLL,则不能也指定 FAST_FORWARD。
打开游标:
OPEN 游标名
提取数据:
FETCH [ [ NEXT | PRIOR | FIRST | LAST
| ABSOLUTE { n(常量) | @nvar(变量) }
| RELATIVE { n | @nvar } ]
FROM 游标名
]
{ { [ GLOBAL ] 游标名 } | @cursor_variable_name }
[ INTO @variable_name [ ,...n ] ]
参数:
NEXT:返回紧跟当前行之后的结果行,并且当前行递增为结果行。如果 FETCH NEXT 为对游标的第一次提取操作,则返回结果集中的第一行。NEXT 为默认的游标提取选项。
PRIOR:返回紧临当前行前面的结果行,并且当前行递减为结果行。如果 FETCH PRIOR 为对游标的第一次提取操作,则没有行返回并且游标置于第一行之前。
FIRST:返回游标中的第一行并将其作为当前行。
LAST:返回游标中的最后一行并将其作为当前行。
ABSOLUTE {n | @nvar}:如果 n 或 @nvar 为正数,返回从游标头开始的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为负数,返回游标尾之前的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为 0,则没有行返回。n 必须为整型常量且 @nvar 必须为 smallint、tinyint 或 int。
RELATIVE {n | @nvar}:如果 n 或 @nvar 为正数,返回当前行之后的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为负数,返回当前行之前的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为 0,返回当前行。如果对游标的第一次提取操作时将 FETCH RELATIVE 的 n 或 @nvar 指定为负数或 0,则没有行返回。n 必须为整型常量且 @nvar 必须为 smallint、tinyint 或 int。
GLOBAL:指定 cursor_name 指的是全局游标。
cursor_name:要从中进行提取的开放游标的名称。如果同时有以 cursor_name 作为名称的全局和局部游标存在,若指定为 GLOBAL 则 cursor_name 对应于全局游标,未指定 GLOBAL 则对应于局部游标。
@cursor_variable_name:游标变量名,引用要进行提取操作的打开的游标。
INTO @variable_name[,...n]:允许将提取操作的列数据放到局部变量中。列表中的各个变量从左到右与游标结果集中的相应列相关联。各变量的数据类型必须与相应的结果列的数据类型匹配或是结果列数据类型所支持的隐性转换。变量的数目必须与游标选择列表中的列的数目一致。
关闭游标:
CLOSE 游标名
释放游标:
DEALLOCATE 游标名
v 常用的配合使用函数:
@@FETCH_STATUS:返回被 FETCH 语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态。
返回值 | 描述 |
0 | FETCH 语句成功。 |
-1 | FETCH 语句失败或此行不在结果集中。 |
-2 | 被提取的行不存在。 |