4. 利用游标修改数据
  SQL Server中的 UPDATE语句 和 DELETE语句也支持游标操作,它们可以通过游标修改或删除游标基表中的当前数据行。
UPDATE语句的格式为:
UPDATE table_name
SET 列名=表达式}[,…n]
WHERE CURRENT OF cursor_name
DELETE语句的格式为:
DELETE FROM table_name
WHERE CURRENT OF cursor_name
说明:
CURRENT OF cursor_name:
 表示当前游标指针所指的当前行数据。CURRENT OF 只能在UPDATE和DELETE语句中使用。
 注意:
  o使用游标修改基表数据的前提是声明的游标是可更新的。
  o 对相应的数据库对象(游标的基表)有修改和删除权限。

5. 关闭游标
  关闭游标后,游标区的数据不可再读。CLOSE语句关闭已打开的游标,之后不能对游标进行读取等操作,但可以使用OPEN语句再次打开该游标。
CLOSE语句的格式为:
CLOSE 游标名
例如:关闭tcursor游标如下描述:
CLOSE tcursor

6 删除游标语句
DEALLOCATE语句删除定义游标的数据结构,删除后不可再用。语句格式:
DEALLOCATE 游标名
例如,删除tcursor游标
DEALLOCATE tcursor

例1,读JS2001班的学生的学号和姓名:
#define MAX 30
EXEC SQL BEGIN DECLARE SECTION;
char TN[12], FU[20]; //定义主变量//
EXEC SQL END DECLARE SECTION;
char tarn1[30][12],tarn2[30][20]; //定义 C 变量//
. . . . . .
EXEC SQL //执行SQL语句,定义游标//
DCLARE Scursor CURSOR FOR //声明游标Scursor//
SELECT sno,sname //查询sno,sname//
FROM student //对student表chax 查询//
WHERE sclass = 'JS2001'; //sclass='JS2001'的班级//
EXEC SQL OPEN Scursor ; //打开游标//
for (i=0; i<MAX; i++)
{ EXEC SQL FETCH FROM Scursor
INTO @TN, @FU; //取到宿主变量//
tarn1[i]= TN; //赋值到C数组变量//
tarn2[i]= FU;
}
....................
EXEC SQL CLOSE Scursor ; //关闭游标//
EXEC SQL DEALLOCATE Scursor ; //删除游标//

例2,定义游标,使结果集包括 pubs 数据库的 authors 表中的所有行和列。因为没指定 SCROLL 选项,FETCH NEXT 是唯一可用的提取选项。
DECLARE authors_cursor CURSOR FOR //声明游标authors_cursor //
SELECT * FROM authors
OPEN authors_cursor //打开游标authors_cursor //
FETCH NEXT FROM authors_cursor //读游标authors_cursor中的一行 //
....................

例3, 定义和使用滚动游标
DECLARE tcursor SCROLL CURSOR FOR
SELECT tname, cname FROM teacher ,couse
WHERE teacher.tno = couse.tno;
OPEN tcursor;
取tcursor中当前位置向下的第二行数据
FETCH RELATIVE 2 FROM tcursor
取tcursor中最后一行数据
FETCH LAST FROM tcursor
取tcursor中当前位置向前的第4行数据
FETCH RELATIVE -4 FROM tcursor

例4 利用 @@FETCH_STATUS 控制一个 WHILE 循环中的游标活动。
DECLARE S_Cursor CURSOR FOR
SELECT sname, sno FROM student
OPEN S_Cursor
FETCH NEXT FROM S_Cursor
WHILE @@FETCH_STATUS = '000000'
BEGIN FETCH NEXT FROM S_Cursor END
CLOSE S_Cursor
DEALLOCATE S_Cursor

例5,职工普调工资,从最低工资调起,每人工资长10%,但工资总额不能超过50万元。当调完某个职工工资后,如果工资总额达到或超过50万元,就不再调了,另外,如果职工全部调了一遍,工资总额还没到50万元,也到此为止。现有职工表emp,定义了一个游标cl,游标的查询语句取出职工号和工资值,并按增序排列。下面是程序代码:
void addsalary()
{ EXEC SQL BEGIN DECLARE SECTION //声明SQL变量//
char empno[8], e_sno,SQLSTATE[6];
float s_sal, e_sal;
EXEC SQL END DECLARE SECTION; //声明SQL变量完//
EXEC SQL DECLARE cl CURSOR FOR //定义游标 cl ,对emp表的eno,sal列可以作任何操作
SELECT eno, sal
FROM emp
ORDER BY sal ASC;
EXEC SQL OPEN cl; //打开游标/
EXEC SQL SELECT SUM(sal) INTO @s_sal FROM emp; //取工资总和到s_sal
while(s_sal < 500000.00)
{
EXEC SQL FETCH FROM cl
INTO @e_sno , @e_sal; //从游标中读出的数据放入e_sno,e_sal变量
If(SQLSTATE='02000') BREAK; //读完记录,退出//
EXEC SQL UPDATE emp
SET sal=sal*1.1 //游标内容更新,将empno=e_sno相应的sal*1.1
WHERE empno=@e_eno;
s_sal = s_sal+ e_sal *0.1; //计算工资总和到s_sal
};
EXEC SQL CLOSE cl; /关闭游标/}

   SQL Server提供两种游标应用接口方法:第一种是符合ANSI标准的SQL游标语句,它们可以实现声明、打开、读取或关闭游标操作,这些语句可用在Transact_SQL语句或存储过程内;第二种是库函数形式,客户端的DB_Library 或ODBC应用程序可以调用这些函数。
   游标语句增强了Transact_SQL对集合数据的处理能力,在SQL Server中,通过游标还可以修改或删除基表中的数据。

7,使用游标时应注意的问题:
 (1) 尽管使用游标比较灵活,可以实现对数据集中单行数据的直接操作,但游标会在下面几个方面影响系统的性能:
  -使用游标会导致页锁与表锁的增加
  -导致网络通信量的增加
  -增加了服务器处理相应指令的额外开销
 (2) 使用游标时的优化问题:
  -明确指出游标的用途:for read only或for update
  -在for update后指定被修改的列