游标ISO Syntax
--1.FOR UPDATE ,更新不允许的列,出错,游标有 FOR UPDATE 列表,但请求更新的列不在此列表中
DECLARE mycursor CURSOR FOR SELECT * FROM aa1 FOR UPDATE OF 生成工号
--DECLARE mycursor CURSOR FOR SELECT * FROM aa1 FOR UPDATE
OPEN mycursor
FETCH NEXT FROM mycursor
UPDATE aa1
SET 户名 = '周杰伦2'
WHERE CURRENT OF mycursor ;
CLOSE mycursor
DEALLOCATE mycursor
--2.for read ONLY,游标是只读的。不可更新
DECLARE mycursor CURSOR FOR SELECT 费用ID,户名 FROM aa1 FOR READ ONLY
OPEN mycursor
FETCH NEXT FROM mycursor
UPDATE aa1
SET 户名 = '周杰伦2'
WHERE CURRENT OF mycursor ;
CLOSE mycursor
DEALLOCATE mycursor
--3.LAST,PRIOR,ABSOLUTE,RELATIVE,指定SCROLL 全部可用,不指定只能用next,出错如fetch: 提取类型 prior 不能与只进游标一起使用。
DECLARE vend_cursor SCROLL CURSOR FOR SELECT * FROM aa1
--DECLARE vend_cursor CURSOR FOR SELECT * FROM aa1
OPEN vend_cursor
FETCH LAST FROM vend_cursor
FETCH PRIOR FROM vend_cursor
FETCH ABSOLUTE 45 FROM vend_cursor
FETCH RELATIVE 2 FROM vend_cursor
CLOSE vend_cursor
DEALLOCATE vend_cursor
--4.INSENSITIVE关键字
/*
表明MS SQL SERVER 会将游标定义所选取出来的数据记录存放在一临时表内(建立在tempdb 数据库下)。
对该游标的读取操作皆由临时表来应答。因此,对基本表的修改并不影响游标提取的数据,
即游标不会随着基本表内容的改变而改变,同时也无法通过游标来更新基本表。
如果不使用该保留字,那么对基本表的更新、删除都会反映到游标中。
*/
--a.
DECLARE mycursor INSENSITIVE CURSOR FOR SELECT 户号,户名 FROM aa1
OPEN mycursor
FETCH NEXT FROM mycursor
/*
UPDATE aa1 SET 户名='刘德华' WHERE 户号=30
*/
CLOSE mycursor
DEALLOCATE mycursor
--fetch next的数据,open mycursor之后,update执行一次,到第五条数据,数据未改变
/*
户号 户名
30 周杰伦111
*/
-----------------------------------------------------------------
--b.
DECLARE mycursor CURSOR FOR SELECT 户号,户名 FROM aa1
OPEN mycursor
FETCH NEXT FROM mycursor
/*
UPDATE aa1 SET 户名='周杰伦12' WHERE 户号=30
*/
CLOSE mycursor
DEALLOCATE mycursor
--fetch next的数据,open mycursor之后,update执行一次,到第五条数据,发生改变
/*
户号 户名
30 周杰伦12
*/
--5.带变量
DECLARE mycursor CURSOR FOR SELECT 费用ID,户名 FROM aa1
OPEN mycursor
DECLARE @费用ID INT
DECLARE @户名 VARCHAR(60)
WHILE @@fetch_status = 0
BEGIN
FETCH NEXT FROM mycursor INTO @费用ID,@户名
SELECT CAST(@费用ID AS VARCHAR(60)) + ' ' + @户名
END
CLOSE mycursor
DEALLOCATE mycursor