游标的基本应用

1.用游标iu该和删除表数据

    通常情况下,使用游标从基本表中检索数据,以实现对数据的行处理。但在某些情况下,需要修改游标中的数据,即进行定位更新或删除游标所包含的数据。所以必须执行另外的更细腻或删除命令,并在WHERE子句中重新给定条件。如果声明游标时使用了FOR UPDATE选项,则可以在UPDATE或DELETE命令中以WHERE CURRENT OD 关键字直接修改或删除游标中的数据。

定位修改游标数据的语句格式如下:

UPDATE table_name

SET { column_name={expression|default|null}[,...n]}

WHERE CURRENT OF {{[GLOBAL]cursor_name}|cursor_variable_name}

删除游标数据的语法格式如下:

DELETE FROM table_name

WHERE CURRENT OF {{[GLOBAL]cursor_name}|cursor_variable_name}

各选项的含义如下:

(1)table_name:要更新或删除的表名。

(2)column_name:要更新的列名。

(3)expression:变量、常量、表达式或加上括弧的返回单个值的SELECT语句。expression返回的值将替换column_name的现有值。DEFAULT|NULL指定使用对列定义的默认值或空值替换劣种的现有值。

(4)cursor_name:游标名,cursor_variable_name为游标变量名。

为了修改与删除游标中的数据,在声明游标时应使用FOR UPDATE选项。

举例:定义游标cur_customer,通过cur_customer更新customer表中的customer_name和linkman_name列。

DECLARE cur_customer CURSOR

FOR

SELECT * FROM customer

FOR UPDATE OF customer_name,linkman_name         /*该两列可更新*/

OPEN cur_customer                                                      /*打开cur_curstomer游标*/

FETCH NEXT FROM cur_curstomer                               /*将第一行数据放入缓冲区,一边更新操作*/

UPDATE customer

SET customer_name='南方体育用品公司',linkman_name='李强'

WHERE CURRENT OF cur_customer

CLOSE cur_curstomer                                                   /*关闭cur_customer游标*/

本例执行后,通过cur_customer游标更新了表customer读入的第一行数据。

若要删除customer表的一行数据,则使用以下命令替换上例中的UPDATE语句,就可以删除通过游标读入的一行数据。

DELETE FROM customer

WHERE CURRENT OF cur_customer

2.使用游标变量

CURSOR关键字还可以作为变量类型来使用,此时,必须要将CURSOR进行变量声明。其语法格式为:

DECLARE {@cursor_variable_name CURSOR}[,...N]

其中,@cursor_variable_name为游标类型的局部变量名。

游标与一个游标变量相关联的方法有以下两种。

(1)分别定义游标变量与游标,再将游标赋给游标变量。

DECLARE @cur_var CURSOR                                          /*定义游标变量*/

DECLARE cur_customer CURSOR

FOR SELECT * FROM customer                                      /*定义游标*/

SET @cur_var=cur_customer                                         /*设置游标与游标变量的关联*/

(2)定义游标变量后,通过SET命令直接创建游标与游标变量关联。

DECLARE @cur_var CURSOR                                        /*定义游标变量*/

SET @CUR_VAR=CURSOR SCROLL KEYSET FOR         

SELECT * FROM customer                                             /*创建游标与游标变量的关联*/

经SET语句设置游标与游标变量相关联之后,再Transact-SQL游标语句中就可以使用游标变量代替游标名称进行数据操作了。

举例:通过游标变量来操作上例所声明的游标cur_customer,操作完成后,删除游标变量。

DECLARE @cur_var cursor

SET @cur_var=cur_customer

OPEN @cur_var

FETCH NEXT FROM @cur_var

CLOSE @cur_var

DEALLOCATE @CUR_VAR

DEALLOCATE @cur_var语句执行后,就不能重新OPEN@cur_var了。

3.滚动游标

如果在游标定义语句中使用了关键字SCROLL,则可以用FETCH语句在游标集合内向前或向后移动,也可以直接跳到集合的某一条记录。

举例:定义可以任意移动的游标。

声明SCROLL游标cur_customer.

DECLARE cur_customer CURSOR

SCROLL

READ_ONLY

FOR

SELECT * FROM customer

一旦用SCROLL关键字声明游标,则FETCH语句的灵活性就大大增加了。以下用FETCH语句将记录指针滚动到下一条、前一条、第一条、最后一条记录,以及用ABSOLUTE滚动到第5条记录,用RELATIVE相对滚动到第5条的前(负值)2条记录。

OPEN cur_customer

FETCH NEXT FROM cur_customer

FETCH PRIOR FROM cur_customer

FETCH FIRST FROM  cur_customer

FETCH  LAST FROM cur_customer

FETCH ABSOLUTE 5 FROM cur_customer

FETCH RELATIVE -2 FROM cur_customer

注意:每次滚动操作都应检查@@fetch_status,以确保新位置的有效性。若@@fetch_status值不为0,则操作无效。








猜你喜欢

转载自blog.csdn.net/geyulei/article/details/80742701