T-SQL游标的使用

news2024/11/28 20:34:19

一.建表

INSERT INTO cloud VALUES( '你' )
INSERT INTO cloud VALUES( '一会看我' )
INSERT INTO cloud VALUES( '一会看云' )
INSERT INTO cloud VALUES( '我觉得' )
INSERT INTO cloud VALUES( '你看我时很远' )
INSERT INTO cloud VALUES( '你看云时很近' )

二.建立游标

1.游标的一般格式
DECLARE 游标名称 CURSOR 
FOR 
SELECT 字段1,字段2,字段3,... FROM 表名 WHERE ...
OPEN 游标名称
FETCH NEXT FROM 游标名称 INTO 变量名1,变量名2,变量名3,...
WHILE @@FETCH_STATUS=0
   BEGIN
      SQL语句
      FETCH NEXT FROM 游标名称 INTO 变量名1,变量名2,变量名3,...
    END
CLOSE 游标名称
DEALLOCATE 游标名称 (释放游标)

cursor:表示在光标当前位置执行操作

2.实例:

DECLARE
@v_line varchar(50)                     ---------声明一个装载语句的字符串
DECLARE cursor_cloud CURSOR
FOR
SELECT linetext from cloud;
BEGIN 
OPEN cursor_cloud;                       -------打开游标
FETCH NEXT FROM cursor_cloud INTO @v_line-------将游标移向下一行,把获取的内容放入@V_line
WHILE @@FETCH_STATUS = 0                 -------检测是否成功获取数据
BEGIN
PRINT @v_line                            -------进行SQL语句操作
FETCH NEXT FROM cursor_cloud INTO @v_line-------向下移行
END
CLOSE cursor_cloud;                      -------关闭游标
DEALLOCATE cursor_cloud;                 -------释放游标
END;

结果得:

三.使用游标修改数据(update)

DECLARE
 @v_line varchar(50),
 @i int
 DECLARE cursor_cloud CURSOR
 FOR
 SELECT linetext from cloud;
BEGIN
 SET @i = 0;
 OPEN cursor_cloud;
 FETCH NEXT FROM cursor_cloud INTO @v_line
 WHILE @@FETCH_STATUS = 0
 BEGIN
 SET @i = @i + 1;
 UPDATE cloud SET linetext = CAST(@i as varchar(5)) + ' ' + @v_line WHERE linetext =
@v_line;
 FETCH NEXT FROM cursor_cloud INTO @v_line 
 END
 CLOSE cursor_cloud;
 DEALLOCATE cursor_cloud;
END;

结果得:

四.可灵活移动的游标

DECLARE
 @v_line varchar(50)
 DECLARE cursor_cloud CURSOR SCROLL
 FOR
 SELECT linetext from cloud;
BEGIN
 OPEN cursor_cloud;
 FETCH FIRST FROM cursor_cloud INTO @v_line
 PRINT '第一行 ' + @v_line
 FETCH NEXT FROM cursor_cloud INTO @v_line
 PRINT '第一行的下一行 ' + @v_line
 FETCH LAST FROM cursor_cloud INTO @v_line
 PRINT '最后一行 ' + @v_line
 FETCH PRIOR FROM cursor_cloud INTO @v_line
 PRINT '最后一行的前一行 ' + @v_line
 CLOSE cursor_cloud;
 DEALLOCATE cursor_cloud;
END;

 结果得

五.可更新的游标

DECLARE
 @v_line varchar(50),
 @i int
 DECLARE cursor_cloud CURSOR
 FOR
 SELECT linetext from cloud for update;
BEGIN
 DECLARE @v_new_line varchar(50);
 SET @i = 0;
 OPEN cursor_cloud;
 FETCH NEXT FROM cursor_cloud INTO @v_line
 WHILE @@FETCH_STATUS = 0
 BEGIN
 set @v_new_line = SUBSTRING( @v_line, 2,100 );
 UPDATE cloud SET linetext = @v_new_line WHERE CURRENT OF cursor_cloud;
 FETCH NEXT FROM cursor_cloud INTO @v_line 
 END
 CLOSE cursor_cloud;
 DEALLOCATE cursor_cloud;
END;

 通过update...........where current of进行游标的更新

 UPDATE cloud SET linetext = @v_new_line WHERE CURRENT OF cursor_cloud;

表示更新最后一个fetch命令从cursor_cloud游标获得的行 

where current of不仅能结合update操作,也能结合delete进行操作

delete from cloud
WHERE CURRENT OF cursor_clould;

表示删除最后一个fetch命令从cursor_cloud游标获得的行

注:

嵌入式SQL UPDATEDELETE可以使用WHERE子句(不带游标)或WHERE CURRENT OF(带声明游标),但不能同时使用两者。
如果指定的UPDATEDELETE既不带WHERE也不带WHERE CURRENT OF,则会更新或删除表中的所有记录。

更新的限制
当使用WHERE CURRENT OF子句时,不能使用当前字段值更新字段以生成更新的值。
例如,SET Salary=Salary+200或SET Name=UPPER(Name):将字段的字母全部变成大写
尝试这样做会导致

SQLCODE -69错误:SET <field> = <value expression> not allowed with WHERE CURRENT OF <cursor>。
————————————————

原文链接:https://blog.csdn.net/yaoxin521123/article/details/121602006

练习:

插入表如下


insert into words2 values(1,'你最可爱')
insert into words2 values(2,'我说时来不及思索')
insert into words2 values(3,'而思索过后')
insert into words2 values(4,'还是会这么说')

 
      (1)

declare
 @num int,@linetext varchar(100)
 declare cursor_words cursor scroll
 for
 select linetext from words2
 set @num=1
 open cursor_words
 fetch next from  cursor_words into @linetext
 while @@FETCH_STATUS=0
 begin
 print '普希金说的第'+cast(@num as varchar(10))+'句话:'+@linetext
 fetch next from cursor_words into @linetext
 set @num = @num+1
 end
 print ' '
 print'他一共说了'+cast(@num-1 as varchar(10))+'句话'
 close cursor_words
 deallocate cursor_words

(2) 在奇数行后面加逗号,偶数行后面加句号

 declare 
 @i int,@linetext varchar(100)
 declare  cursor_words cursor 
 for
 select linetext from words2
 begin
 set @i=0
 open cursor_words;
 fetch next from cursor_words into @linetext 
 while @@FETCH_STATUS=0
 begin 
 set @i=@i+1
 if(@i%2=1)
 update words2
 set linetext=@linetext+',' where linenum=@i
 else
 update words2  
 set linetext=@linetext+'。' where linenum=@i
 fetch next from cursor_words into @linetext
 end
 close cursor_words
 deallocate cursor_words
 end

再用

 select * from words2

得到

(3)将奇数行和偶数行合并在一起,同时调整相应的行号

重点:where current of

 declare @num int,@linetext varchar(50),@newline varchar(100)
 declare cursor_words2 cursor
 for
 select linetext from words2 for update;-----手工加锁语句
 set @num = 1
 set @newline = ''
 open cursor_words2
 fetch next from cursor_words2 into @linetext
 while @@FETCH_STATUS=0
 begin
set @newline=@newline+@linetext
if @num%2=1
delete from words2 WHERE CURRENT OF cursor_words2----------删除奇数行
else
begin
update words2 set linetext=@newline,linenum=@num/2 WHERE CURRENT OF cursor_words2-----------修改行号
set @newline=''
end
fetch next from cursor_words2 into @linetext
set @num = @num +1
end
close cursor_words2
deallocate cursor_words2

 再用

select *from words2

得到

 其中的加锁语句可以阅读这篇:

http://t.csdn.cn/Hox1D

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/512716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微软Office Plus吊打WPS Office?不一定,WPS未来被它“拿捏”了

微软Office Plus吊打WPS Office&#xff1f; 微软的Office是一款非常强大的软件。不仅仅在办公领域中能给我们带来便利&#xff0c;在娱乐和生活的各个方面的管理也能带来很多便利。 当然&#xff0c;作为国产办公软件的排头兵WPS与微软Office的抗衡已经有长达30多年&#xf…

数据库sql语句(经典)

例题&#xff1a; 先来讲讲not in 和not exists的区别&#xff0c;再开始今天的例题&#xff08;和in&#xff0c;exists相反&#xff09; not in内外表做笛卡尔积&#xff0c;然后按照条件查询&#xff0c;没有用到索引 not exists是对外表进行循环&#xff0c;每次循环再对内…

从中国制造到中国智造,大眼橙投影仪的进阶之路

刚过去的5月10日是中国品牌日&#xff0c;在这一天各级电视台、广播电台以及平面、网络等媒体&#xff0c;都会安排重要版面来讲中国品牌故事。近日&#xff0c;笔者在与一些品牌的接触中&#xff0c;对大眼橙这个品牌印象颇深&#xff0c;大眼橙是智能投影行业的头部品牌&…

详解:函数栈帧的创建与销毁

函数栈帧的创建与销毁 前期问题函数栈帧定义寄存器的种类与功能汇编指令的功能及含义图解main函数之前的调用调用main函数开辟函数栈帧main函数中创建临时变量并初始化为形式参数创建开辟空间Add函数开辟函数栈帧&#xff0c;创建变量并进行运算释放Add函数栈帧 前期问题解答 铁…

STM32F4的输出比较极性和PWM1,PWM2的关系

PWM 输出比较通道 在这里以通用定时器的通道1作为介绍。 如图&#xff0c;左边就是CNT计数器和CCR1第一路的捕获/比较寄存器&#xff0c;它俩进行比较&#xff0c;当CNT>CCR1, 或者CNTCCR1时&#xff0c;就会给输出模式控制器传送一个信号&#xff0c;然后输出模式控制器就…

基于TextCNN、LSTM与Transformer模型的疫情微博情绪分类

基于TextCNN、LSTM与Transformer模型的疫情微博情绪分类 任务概述 微博情绪分类任务旨在识别微博中蕴含的情绪&#xff0c;输入是一条微博&#xff0c;输出是该微博所蕴含的情绪类别。在本次任务中&#xff0c;我们将微博按照其蕴含的情绪分为以下六个类别之一&#xff1a;积…

Docker部署nacos2.1版本集群

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态服…

spring发送qq邮件 + 模板引擎

文章目录 学习链接邮箱配置开启qq邮箱服务相关配置文件 freemarker模板引擎引入依赖配置freemarker编写模板registerTpl.ftl 发送带内嵌图片的邮件 附件效果 学习链接 java邮件发送 Java实现邮件发送 springboot发送QQ邮件&#xff08;最简单方式&#xff09; 刘java-Java使用…

css - 盒子水平垂直居中的几种方式

前端盒子水平垂直居中的几种方式 实现效果图如下&#xff1a; 首先是父元素的基本样式&#xff1a; .container {width: 600px;height: 600px;border: 1px solid red;background-color: antiquewhite;margin: 0 auto;/* 父盒子开启相对定位 */position: relative;}1&#xf…

【Linux】Linux入门学习之常用命令三

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…

Python每日一练(20230511) 跳跃游戏 I\II\III\IV

目录 1. 跳跃游戏 Jump Game I 2. 跳跃游戏 Jump Game II 3. 跳跃游戏 Jump Game III 4. 跳跃游戏 Jump Game IV &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 跳跃游戏 Jump Game …

操作符知识点大全(简洁,全面,含使用场景,演示,代码)

目录 一.算术操作符 1.要点&#xff1a; 二.负数原码&#xff0c;反码&#xff0c;补码的互推 1.按位取反操作符&#xff1a;~&#xff08;二进制位&#xff09; 2.原反补互推演示 三.进制位的表示 1.不同进制位的特征&#xff1a; 2.二进制位表示 3.整型的二进制表…

如何利用python实现灰色关联分析?

1.灰色关联分析简介 灰色系统这个概念是相对于白色系统和黑色系统而言的。从控制论的知识里&#xff0c;颜色一般代表对于一个系统我们已知信息的多少&#xff0c;白色代表信息量充足&#xff0c;黑色代表我们其中的构造并不清楚的系统&#xff0c;而灰色介于两者之间&#xf…

WhatsApp如何让客户参与变得更简单?

WhatsApp对你的品牌来说可能和Twitter和Facebook一样重要&#xff0c;你可能已经把它们纳入你的社交媒体战略。 是的&#xff0c;WhatsApp不仅仅可以用来给同事发短信或与远方的亲戚视频聊天&#xff0c;它也适用于商业。 在发展WhatsApp业务时&#xff0c;小企业主得到了最优…

K8s基础9——服务发现Coredns、Ingress Controller多种暴露方式、TLS+DaemonSet、Headless Services

文章目录 一、服务发现机制1.1 环境变量注入1.2 DNS解析 二、Ingress4.1 部署Ingress controller4.2 暴露Ingress Controller4.2.1 SVC NodePort方式4.2.2 共享宿主机网络方式 4.3 默认后端4.4 同域名不同URL转不同服务4.5 不同域名转不同服务4.6 使用https4.6.1 安装cfssl4.6.…

如何用 Serverless 一键部署 Stable Diffusion?

作者 | 寒斜&#xff08;阿里云智能技术专家&#xff09; 思路 其实很简单&#xff0c; 我们只需要将镜像里面的动态路径映射到 NAS文件存储里面即可&#xff0c;利用 NAS 独立存储文件模型&#xff0c;扩展&#xff0c;语言包等&#xff0c;并且我们可以为管理 NAS 单独配置…

使用Python和Django构建一个全功能的在线医疗问诊平台

在线医疗问诊平台应运而生&#xff0c;为患者和医生之间提供了一个便捷的交流平台。本文将介绍如何使用Python和Django构建一个全功能的在线医疗问诊平台。 功能 在我们的平台上&#xff0c;患者可以注册账户、查询医生、预约诊断、支付费用并与医生沟通。医生可以创建个人档…

【.NET CORE】使用Rotativa.AspNetCore将网页转换为PDF

插件功能&#xff1a;将在线网页转换为PDF显示&#xff0c;文件保存 组件配置&#xff1a; 1、在NuGet管理中搜索Rotativa.AspNetCore并安装稳定版&#xff0c;项目github地址&#xff1a;GitHub - webgio/Rotativa.AspNetCore: Rotativa for Asp.Net Core 2、github下载项目…

Docker安装部署MySQL

1、拉取镜像 docker pull mysql:8.0 2、查看镜像 docker images 3、创建文件夹 mkdir ~/mysql cd mysql/ 4、创建并启动MySQL容器 docker run -id \ > -p 3306:3306 \ > --namec_mysql \ > -v $PWD/conf:/etc/mysql/conf.d \ > -v $PWD/logs:/logs \ > -…

Vue Emelent-UI表格合并行或列rowspan和colspan的作用

Vue Element-UI的table组件支持合并行或者列&#xff0c;在这里做个简单的学习笔记。 我们可以通过rowspan和colspan来进行单元格合并&#xff0c;那么这两个属性是什么意思呢&#xff0c;通过官方给的demo来探讨下。 上述单元格将行index为奇数的第一列和第二列合并为一个单…