SQL游标使用及实例
declare my_cursor cursor scroll dynamic
for
select * from t_msg
open my_cursor
declare @name sysname
fetch next from my_cursor into @name
while(@@fetch_status=0)
begin
print 'UserName: ' + @name
--fetch next from my_cursor
fetch next from my_cursor into @name
end
--fetch first from my_cursor into @name
print @name
close my_cursor
deallocate my_cursor
使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。
2. 如何使用游标:
一般地,使用游标都遵循下列的常规步骤:
(1) 声明游标。把游标与T-SQL语句的结果集联系起来。
(2) 打开游标。
(3) 使用游标操作数据。
(4) 关闭游标。
2.1. 声明游标
DECLARE CURSOR语句SQL-92标准语法格式:
DECLARE 游标名 [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR sql-statement
Eg:
Declare MycrsrVar Cursor
FOR Select * FROM tbMyData
2.2 打开游标
OPEN MycrsrVar
当游标被打开时,行指针将指向该游标集第1行之前,如果要读取游标集中的第1行数据,必须移动行指针使其指向第1行。就本例而言,可以使用下列操作读取第1行数据:
FETCH FIRST from E1cursor
或 FETCH NEXT from E1cursor
2.3 使用游标操作数据
下面的示例用@@FETCH_STATUS控制在一个WHILE循环中的游标活动
DECLARE E1cursor cursor
FOR SELECT * FROM c_example
OPEN E1cursor
FETCH NEXT from E1cursor
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT from E1cursor
END
CLOSE E1cursor
DEALLOCATE E1cursor
2.4 关闭游标
使用CLOSE语句关闭游标
CLOSE { { [ GLOBAL ] 游标名 } | 游标变量名 }
使用DEALLOCATE语句删除游标,其语法格式如下:
DEALLOCATE { { [ GLOBAL ] 游标名 } | @游标变量名
3. FETCH操作的简明语法如下:
FETCH
[ NEXT | PRIOR | FIRST | LAST]
FROM
{ 游标名 | @游标变量名 } [ INTO @变量名 [,…] ]
参数说明:
NEXT 取下一行的数据,并把下一行作为当前行(递增)。由于打开游标后,行指针是指向该游标第1行之前,所以第一次执行FETCH NEXT操作将取得游标集中的第1行数据。NEXT为默认的游标提取选项。
INTO @变量名[,…] 把提取操作的列数据放到局部变量中。列表中的各个变量从左到右与游标结果集中的相应列相关联。各变量的数据类型必须与相应的结果列的数据类型匹配或是结果列数据类型所支持的隐性转换。变量的数目必须与游标选择列表中的列的数目一致。
--------------------------------------------------------------------------------------------------------------------------------
每执行一个FETCH操作之后,通常都要查看一下全局变量@@FETCH_STATUS中的状态值,以此判断FETCH操作是否成功。该变量有三种状态值:
? 0 表示成功执行FETCH语句。
? -1 表示FETCH语句失败,例如移动行指针使其超出了结果集。
? -2 表示被提取的行不存在。
由于@@FETCH_STATU是全局变量,在一个连接上的所有游标都可能影响该变量的值。因此,在执行一条FETCH语句后,必须在对另一游标执行另一FETCH 语句之前测试该变量的值才能作出正确的判断。
更新数据;
declare my_youbiao cursor
for select * from t_msg
for update
open my_youbiao
fetch next from my_youbiao
while @@fetch_status=0
begin
--update t_msg set msg='1234567890' where current of my_youbiao
update my_youbiao set msg='123' where current of my_youbiao
fetch next from my_youbiao
print 'asdfasd11'
end
close my_youbiao
deallocate my_youbiao
print 'asdfasd'
测试通过:

--select * frommaster..sysprocesses
use test
declare my_cursorcursor scroll dynamic--scroll表示可以向前或向后移动
dynamic:表示可写也可读,
for
select F3fromtemp --定义my_cursor 游标

open my_cursor--打开游标
declare@namenvarchar(128)--定义一个变量
fetchnextfrom my_cursorinto
@name --游标停在第一条记录前面,第一次执行,测试有没有记录存在
while(@@fetch_status=0)--取数据,直到-2即没有记录
begin
print'姓名:' +
@name
--fetch next from my_cursor
fetchnextfrom my_cursorinto
@name
end
--fetch first from my_cursor into @name
print@name
--update temp set F9='zzg' where current of my_cursor

close my_cursor
deallocate my_cursorSQL游标使用及实例的更多相关文章
- 网上看到一份详细sql游标说明 《转载 https://www.cnblogs.com/xiongzaiqiren/p/sql-cursor.html》
SQL游标(cursor)详细说明及内部循环使用示例 游标 游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果.每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获 ...
- OCM_第十五天课程:Section6 —》数据库性能调优 _SQL 访问建议 /SQL 性能分析器/配置基线模板/SQL 执行计划管理/实例限制
注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...
- 利用navicat创建存储过程、触发器和使用游标的简单实例
利用navicat创建存储过程.触发器和使用游标的简单实例 标签: navicat存储过程触发器mysql游标 2013-08-03 21:34 15516人阅读 评论(1) 收藏 举报 分类: 数 ...
- SQL语句学习手册实例版
SQL语句学习手册实例版 表操作 例1 对于表的教学管理数据库中的表 STUDENTS ,可以定义如下: CREATE TABLE STUDENTS (SNO NUMERIC (6, ...
- 由于启动用户实例的进程时出错,导致无法生成 SQL Server 的用户实例。该连接将关闭。
错误:由于启动用户实例的进程时出错,导致无法生成SQL Server的用户实例. 原因:添加安装SQLEXPRESS时,估计装在了不同的目录下: 解决方法:关闭Sqlserver及相关的程序,删除目录 ...
- SQL迁移到ORACLE实例
nohup ./command.sh > output 2>&1 & SQL迁移到ORACLE实例 日常运维中,我们经常会有数据库不同类型的迁移,比较多的就是从sql se ...
- sql 游标例子 根据一表的数据去筛选另一表的数据
sql 游标例子 根据一表的数据去筛选另一表的数据 DECLARE @MID nvarchar(20)DECLARE @UTime datetime DECLARE @TBL_Temp table( ...
- sql 游标循环当中重新赋值
sql 游标循环当中的变量必须重新赋值不然变量的值就是前次循环的值
- 由于检索用户的本地应用程序数据路径时出错,导致无法生成 SQL Server 的用户实例
/”应用程序中的服务器错误. 由于检索用户的本地应用程序数据路径时出错,导致无法生成 SQL Server 的用户实例.请确保该用户在此计算机上有本地用户配置文件.该连接将关闭. 堆栈跟踪: [Sql ...
随机推荐
- Mybatis使用过程问题总结
Mybatis配置文件 test语句问题 字符串比较问题 示例语句:<if test="isIbatis == 'Y'"></if> 问题:NumberEx ...
- MySQL学习笔记(二)
连接与断开服务器 应该以下面的方式连接MySQL服务器,而不是将密码以明文方式输入连接. C:\> mysql -h host -u user -pEnter password: ******* ...
- Python基础篇(二)
Python最基本的数据结构是序列(sequence),序列中的每个元素被分以以0开头的唯一的一个id号. Python中有6种内建的序列:列表,元组,字符串,Unicode字符串,buffer对象和 ...
- 前端系列之CSS基础知识概述
1.什么是DIV (1).div就是html一个普通标签,进行区域划分.特性:独自占一行.独自不能实现复杂效果.必须结合css样式进行渲染. (2).div通常其是块级元素 (3).div是定义文档中 ...
- 运行所选代码生成器时出错:“预期具有协定名称 "NuGet.VisualStudio.IVsPackageInstallerServices" 的1导出 ——VS2015错误记录
在编写ASP.NET MVC控制器后,右键添加视图时,VS2015报出错误: 运行所选代码生成器时出错:“预期具有协定名称 "NuGet.VisualStudio.IVsPackageIns ...
- 《Web Scraping With Python》Chapter 1的学习笔记
urllib urllib是python library自带的库,可以直接用. urlopen from urllib.request import urlopen html = urlopen(&q ...
- Angular4---部署---Angular 与 Nginx的邂逅
Nginx + Angular结合操作 1.下载Nginx , 根据自己的版本下载Nginx,关于Nginx配置,请看https://www.cnblogs.com/MBirds/p/6605366. ...
- gitlab手动安装
[博客园 淡水的天空]] 老版 新版 Omnibus package installation Manually
- CENTOS/RHEL 7 系统中设置SYSTEMD SERVICE的ULIMIT资源限制
遇到的问题: golang程序一直出现 too many open files的报错, 尽管对 /etc/security/limits.conf 做了设置, 对最大文件打开数,最大进程数做了调优. ...
- 删除apache注册表
将Apache服务从系统服务中移除: 其实很多服务我们卸载软件后还会残留在服务列表里面,今天给大家提供个删除残留服务的方法注册表清除法. 1.在我的电脑上右键管理,找到看看那些服务是你不需要的,或是残 ...