msql 游标

--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
 
declare @cxname varchar(20),@zxtime varchar(20),@giftreturn varchar(20),@temp5clientid varchar(20);

DECLARE vend_cursor SCROLL  CURSOR
    FOR SELECT * FROM temp5 for read only;
OPEN vend_cursor;
FETCH first  FROM vend_cursor into @cxname,@zxtime,@giftreturn,@temp5clientid;
select  @cxname,@zxtime,@giftreturn,@temp5clientid;--第一条
FETCH last  FROM vend_cursor into @cxname,@zxtime,@giftreturn,@temp5clientid;
select  @cxname,@zxtime,@giftreturn,@temp5clientid;--最后一条
close vend_cursor;
deallocate vend_cursor;

猜你喜欢

转载自kingschan.iteye.com/blog/1487290