现在的位置: 首页 > 综合 > 正文

Cursor的一些学习

2012年12月15日 ⁄ 综合 ⁄ 共 1876字 ⁄ 字号 评论关闭

1:声明Cursor
DECLARE  cursor_name CURSOR
[LOCAL | GLOBAL]
[FORWARD_ONLY | SCROLL]
[DTATIC | KEYSET | DYNAMIC | FAST_FORWARD]
[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]
[TYPE_WARNING]
FOR  select_staement
[FOR UPDATE [OF column_name [,...n]]]

(1.)  LOCAL | GLOBAL
默认是GLOBAL
(2.)  FORWARD_ONLY | SCROLL
默认是FORWARD_ONLY,但若指定[ STATIC | KEYSET | DYNAMIC],则默认为  SCROLL
FORWARD_ONLY :只能由前向后地读取下一条记录
(3.)  STATIC | KEYSET | DYNAMIC | FAST_FORWARD
STATIC会用临时数据表来保存Cursor数据
默认为DYNAMIC
(4.)  READ_ONLY | SCROLL_LOCKS | OPTIMISTIC
设置SCROLL_LOCKS选项时,凡是经由Cursor读取到的记录就会被自动Lock
默认值:
如果数据来源不允许修改,默认为READ_ONLY
‚设置为STATIC或FAST_FORWARD的Cursor默认为READ_ONLY
ƒ设置为DYNAMIC或KEYSET的Cursor默认为OPTIMISTIC

一个例子:

1 DECLARE MyCursor CURSOR
2 FOR SELECT TOP 10 * FROM WG_JS

以上声明了一个全局Cursor,其类型为默认的FORWAR_ONLY、DYNAMIC、及OPTIMISTIC。

2:打开Cursor

1 OPEN  cursor_name

3:关闭Cursor,以解除Cursor与源数据表的连接

1 CLOSE cursor_name

4:删除Cursor,从内存中删除

1 DEALLOCATE cursor_name

5:使用FETCH 读取Cursor中的记录

1 FETCH [[NEXT | PRIOR | FIRST | LAST | ABSOLUTE{n |@nvar | RELATIVE{n | @nvar}}]
2 FROM ]
3 cursor_name
4 [INTO @variable_name[,n]]

6:Cursor的使用技巧
(1).GLOBAL Cursor 与 LOCAL Cursor 的命名空间
GLOBAL Cursor与LOCAL Cursor 是使用不同的命名空间,因此可以声明相同的Cursor名称。当有相同的Cursor时,在使用Cursor时会以 LOCAL Cursor 优先,此时若要存取GLOBAL Cursor,则必须加上GLOBAL Cursor关键词。建议多使用LOCAL Cursor。
(2).取得Cursor 相关信息
@@FETCH_STATUS 全局变量
@@ FETCH_STATUS 可判断最近一次FETCH操作是否成功,返回值意义如下:

返回值 意义
0 FETCH成功
-1 FETCH失败
-2 要FETCH的记录不存在

② @@ CURSOR_ROWS全局变量
@@ CURSOR_ROWS 可查询最近一次OPEN的Cursor中有多少条记录。不过对于返回数据量较大的STATIC 或KEYSET Cursor 来说,SQL Server为了提升效率只会先返回部分内容,此时@@CURSOR_ROWS的值为目前已存入Cursor 中的记录条数,并以负值表示(条数乘以-1)。

返回值 意义
-1 表示OPEN的Cursor为DYNAMIC,由于是动态存取,因此无法确定条数
-n 小于-1的值代表查询数据尚未全部寸入Cursor中,而n则为目前已存入Cursor中的数据条数
0 表示OPEN失败或没有查到任何一条记录
n 数据已完全存入Cursor中,返回值为目前的数据条数

③ CURSOR_STATUS 函数
在参数中必须先指明Cursor的种类(LOCAL、GLOBAL或VARIABLE),然后再指定的Cursor的名称或变量名称。函数返回值为一个smallint,其意义如下:

返回值 意义
1 Cursor已OPEN,其内可能有0、1或多条数据
0 Cursor已OPEN,但已确定其内没有查到任何一条数据。(DYNAMIC Cursor 不会返回次值,因其内容是动态更新的)
-1 Cursor已CLOSE
-2 Cursor变量未参照到实际Cursor,或参照的Cursor已被DEALLOCATE
-3 指定的Cursor名称或变量不存在

 

抱歉!评论已关闭.