游标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 
  
 
 
posted @ 2010-10-25 18:16  qanholas  阅读(770)  评论(0编辑  收藏  举报