SQL 游标的使用

news/2024/7/4 18:08:08
我们都知道在关系数据库中,都是面向集合进行查询的,而游标却是化整为零,是按行查询的,举个例子比如说之前那个壕买了99台苹果6,他可以一次性就买了99台,这正是我们平常使用SQL的方式,他也可以分成若干次买,这就是游标的方式,一次只查询一行。


-- 游标分为游标类型和游标变量,对于游标变量来说,游标变量支持两种方式赋值,定义时赋值和先定义后赋值,
--定义游标变量像定义其他局部变量一样,在游标前加”@”,注意,如果定义全局的游标,只支持定义时直接赋值,
--并且不能在游标名称前面加“@”,两种定义方式如下:


--DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] 
--     [ FORWARD_ONLY | SCROLL ] 
--     [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] 
--     [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] 
--     [ TYPE_WARNING ] 
--     FOR select_statement 
--     [ FOR UPDATE [ OF column_name [ ,...n ] ] ]

其中各参数的含义:
STATIC  KEYSET  DYNAMIC  和 FAST_FORWARD 四选一
    这四个关键字是游标所在数据集所反应的表内数据和游标读取出的数据的关系
    STATIC意味着,当游标被建立时,将会创建FOR后面的SELECT语句所包含数据集的副本存入tempdb数据库中,任何对于底层表内数据的更改不会影响到游标的内容.
    DYNAMIC是和STATIC完全相反的选项,当底层数据库更改时,游标的内容也随之得到反映,在下一次fetch中,数据内容会随之改变
    KEYSET可以理解为介于STATIC和DYNAMIC的折中方案。将游标所在结果集的唯一能确定每一行的主键存入tempdb,当结果集中任何行改变或者删除时,@@FETCH_STATUS会为-2,KEYSET无法探测新加入的数据
    FAST_FORWARD可以理解成FORWARD_ONLY的优化版本.FORWARD_ONLY执行的是静态计划,而FAST_FORWARD是根据情况进行选择采用动态计划还是静态计划,大多数情况下FAST_FORWARD要比FORWARD_ONLY性能略好.
 
    READ_ONLY  SCROLL_LOCKS  OPTIMISTIC 三选一 
    READ_ONLY意味着声明的游标只能读取数据,游标不能做任何更新操作
    SCROLL_LOCKS是另一种极端,将读入游标的所有数据进行锁定,防止其他程序进行更改,以确保更新的绝对成功

    OPTIMISTIC是相对比较好的一个选择,OPTIMISTIC不锁定任何数据,当需要在游标中更新数据时,如果底层表数据更新,则游标内数据更新不成功,如果,底层表数据未更新,则游标内表数据可以更新




--定义后直接赋值全局游标,在批处理结束之后依然存在
--默认和FORWARD_ONLY只支持FETCH NEXT 选项;SCROLL 支持向任何方向移动
Declare goods_CursorG CURSOR global SCROLL FOR 
Select GoodsId from T_Goods

--先定义后赋值,局部游标,在批处理结束后被隐式释放,无法再让其他批处理中调用

--Declare @goods_CursorT CURSOR
--Set @goods_CursorT= CURSOR FOR
--Select * from T_Goods

GO

--OPEN goods_CursorT
OPEN goods_CursorG

--FETCH LAST FROM goods_CursorT
--FETCH LAST FROM goods_CursorG

--取下一行
Declare @nextRow VARCHAR(200)
FETCH NEXT FROM goods_CursorG INTO @nextRow
PRINT @nextRow

--取最后一行
Declare @lastRow VARCHAR(200)
FETCH LAST FROM goods_CursorG INTO @lastRow
PRINT @lastRow

--取第一行
Declare @firstRow VARCHAR(200)
FETCH FIRST FROM goods_CursorG INTO @firstRow
PRINT @firstRow

--取上一行
Declare @preRow VARCHAR(200)
FETCH PRIOR FROM goods_CursorG INTO @preRow
PRINT @preRow

--取第三行
Declare @thirdRow VARCHAR(200)
FETCH ABSOLUTE 3 FROM goods_CursorG INTO @thirdRow
PRINT @thirdRow

--取相对当前来说上一行
Declare @relativeRow VARCHAR(200)
FETCH RELATIVE -1 FROM goods_CursorG INTO @relativeRow
PRINT @relativeRow


--关闭游标
--CLOSE goods_CursorG
--释放游标
--DEALLOCATE goods_CursorG
游标经常会和全局变量@@FETCH_STATUS与WHILE循环来共同使用,以达到遍历游标所在数据集的目的

Declare good_CursorG CURSOR global SCROLL FOR 
Select GoodsId,GoodsType from T_Goods

Open good_CursorG
Declare @id nvarchar(200)
Declare @type nvarchar(200)

While @@FETCH_STATUS=0
Begin
Print @id
Print @type
FETCH NEXT FROM good_CursorG INTO @id,@type

End

CLOSE good_CursorG
DEALLOCATE good_CursorG

PS:FETCH的一些参数:




http://www.niftyadmin.cn/n/634841.html

相关文章

完美洗牌算法(2013年UC校招笔试、2016阿里实习生笔试)

题目详情:有个长度为2n的数组{a1,a2,a3,...,an,b1,b2,b3,...,bn},希望排序后{a1,b1,a2,b2,....,an,bn},要求时间复杂度O(n),空间复杂度0(1)的解法。 思路一:位置置换pefect_shuffle1算法 数组下标:1 2…

图像特征点匹配(视频质量诊断、画面抖动检测)

在视频质量诊断中,我们通常会涉及到“画面抖动”的检测。在此过程中就需要在视频中隔N帧取一帧图像,然后在获取的两帧图像上找出特征点,并进行相应的匹配。 当然了,这一过程中会出现很多的问题,例如:特征点…

MyEclipse下安装FreeMark插件

现在大多人人喜欢用FreeMark模板。但是这个模板在myeclipse或者是eclipse下却是不能只能提示,一大堆只是没有颜色区分的显示在哪里。万能天国总是有办法。 点我去官网下载(比较慢)我的CSDN资源下载(速度快 推荐 已配置好) 配置 如果你选择的是我的CSDN 资源下载直接…

WebForm运行的部分原理

首先WebForm即web窗体包含两个页面文件:aspx前台页面和cs后台页面文件。通过反编译器Reflector我们可以看到在Dll程序集中前台页面和后台页面分别生成了两个不同的类,而且前台页面aspx类继承于后台页面CS类。下面这个登陆的小例子是我们用的最多的: 在as…

从摄像头中读取图像 OpenCV

//(一) 从摄像头中读取图像并保存成视频 //图像类型 IplImage* #include "cv.h" #include "highgui.h" int main( int argc, char** argv ) { CvCapture* capture 0; IplImage* frame 0; capture cvCaptureFromCAM( 0 ); int fps25; //捕捉帧率 //do…

oracle数据库中,数据表无法执行数据操作语句,提示记录已被锁住

在oracle数据库中&#xff0c;数据表无法执行update语句&#xff0c;原因是该数据表已被其他用户锁定&#xff0c;解决方法如下 首先&#xff0c;执行如下sql语句&#xff1a; <span style"font-size:24px;">select * from v$session t1, v$locked_object t2 …

深入浅出OOP(二): 多态和继承

2019独角兽企业重金招聘Python工程师标准>>> 本文是深入浅出OOP第二篇&#xff0c;主要说说继承的话题。 继承的介绍 在OOP中&#xff0c;继承有如下的定义&#xff1a; 继承是一种OOP的机制&#xff0c;用于派生继承预定义的类 在这个继承关系中&#xff0c;预定义…

【分享】最新版PLSQL下载地址

官方下载地址&#xff1a; http://download.allroundautomations.com/plsqldev1100.exe 注册码&#xff1a; Product Code&#xff1a;4t46t6vydkvsxekkvf3fjnpzy5wbuhphqz serial Number&#xff1a;601769 password&#xff1a;xs374ca