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,则操作无效。