游标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 @   qanholas  阅读(771)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
点击右上角即可分享
微信分享提示