cursor游标.docx
《cursor游标.docx》由会员分享,可在线阅读,更多相关《cursor游标.docx(6页珍藏版)》请在冰点文库上搜索。
cursor游标
原理:
游标就是把数据按照指定要求提取出相应的数据集,然后逐条进行数据处理。
1.1游标的概念
游标(Cursor)它使用户可逐行访问由SQLServer返回的结果集。
使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。
用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。
游标机制允许用户在SQLserver内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。
1.2游标的优点
从游标定义可以得到游标的如下优点,这些优点使游标在实际应用中发挥了重要作用:
1)允许程序对由查询语句select返回的行集合中的每一行执行相同或不同的操作,而不是对整个行集合执行同一个操作。
2)提供对基于游标位置的表中的行进行删除和更新的能力。
3)游标实际上作为面向集合的数据库管理系统(RDBMS)和面向行的程序设计之间的桥梁,使这两种处理方式通过游标沟通起来。
1.3游标的使用
讲了这个多游标的优点,现在我们就亲自来揭开游标的神秘的面纱。
使用游标的顺序:
声名游标、打开游标、读取数据、关闭游标、删除游标。
1.3.1声明游标
最简单游标声明:
DECLARE<游标名>CURSORFOR
其中select语句可以是简单查询,也可以是复杂的接连查询和嵌套查询
1.3.2打开游标
非常简单,我们就打开刚才我们声明的游标mycursor
OPENmycursor
1.3.3读取数据
FETCH[NEXT|PRIOR|FIRST|LAST]FROM{游标名|@游标变量名}[INTO@变量名[,…]]
参数说明:
NEXT取下一行的数据,并把下一行作为当前行(递增)。
由于打开游标后,行指针是指向该游标第1行之前,所以第一次执行FETCHNEXT操作将取得游标集中的第1行数据。
NEXT为默认的游标提取选项。
INTO@变量名[,…]把提取操作的列数据放到局部变量中。
列表中的各个变量从左到右与游标结果集中的相应列相关联。
各变量的数据类型必须与相应的结果列的数据类型匹配或是结果列数据类型所支持的隐性转换。
变量的数目必须与游标选择列表中的列的数目一致。
1.3.4关闭游标
CLOSEmycursor
1.3.5删除游标
DEALLOCATEmycursor
给出具体的例子:
*/
----------------------------------------------
declare@IDnvarchar(20);--定义变量来保存ID号
declare@DATEDATETIME;
DECLARE@DFDNVARCHAR(200);--定义变量来保存值
SET@DFD='';
declaremycursorcursorfor
selectMID,CreatedDatefromFD_Menu--为所获得的数据集指定游标
openmycursor--打开游标
fetchnextfrommycursorinto@ID,@DATE--开始抓第一条数据
while(@@fetch_status=0)--如果数据集里一直有数据
begin
--selecttb_b.name,(tb_b.gz+@A)fromtb_bwheretb_b.id=@id--开始做想做的事(什么更新呀,删除呀)
SET@DFD=@DFD+CAST(@IDASNVARCHAR)+'.V.'+CONVERT(NVARCHAR,@DATE,111);
select@DFD;
fetchnextfrommycursorinto@ID,@DATE--跳到下一条数据
end
closemycursor--关闭游标
deallocatemycursor--删除游标
-------------------------------------------------------------------------
-----------------------循环示例------------------------------------------
-------------------------------------------------------------------------
TRUNCATETABLEV_TEST
DECLARE@iINT;
SET@i=1;
WHILE@i<1000
BEGIN
INSERTINTOV_TEST(V_Name,V_DESC)values('IamV'+str(@i),'Victor'+str(1000-@i))
SET@i=@i+1
END
SELECT*FROMV_TEST
-------------------------------------------------------------------------
DECLARE@IDBIGINT;
DECLARE@NAMENVARCHAR(50);
DECLAREV_CURSORCURSORFOR(
SELECTV_ID,V_NameFROMV_TESTWHERERIGHT(V_NAME,2)='10'
)
OPENV_CURSOR;
FETCHNEXTFROMV_CURSORINTO@ID,@NAME
WHILE(@@FETCH_STATUS=0)
BEGIN
PRINTCAST(@IDASNVARCHAR)+@NAME;
FETCHNEXTFROMV_CURSORINTO@ID,@NAME;
END
CLOSEV_CURSOR;
DEALLOCATEV_CURSOR;
-------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
/*
声明SCROLL游标并使用其它FETCH选项
scroll表示可随意移动游标指针(否则只能向前)
下例创建一个SCROLL游标,使其通过LAST、PRIOR、RELATIVE和ABSOLUTE选项支持所有滚动能力。
*/
-------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
--声明局部变量
DECLARE@IDBIGINT;
DECLARE@NAMENVARCHAR(50);
DECLAREV_CURSORSCROLLCURSORFOR
SELECTV_ID,V_NameFROMV_TEST;
OPENV_CURSOR;
--定位到指定位置的记录
FETCHABSOLUTE50fromV_CURSORinto@ID,@NAME
select@idasid,@nameasname
--定位到当前记录相对位置记录
FETCHRELATIVE-30fromV_CURSORinto@id,@name
select@idasid,@nameasname
--定位到当前记录前一条
fetchpriorfromV_CURSORinto@id,@name
select@idasid,@nameasname
--定位到当前记录后一条
fetchnextfromV_CURSORinto@id,@name
select@idasid,@nameasname
--定位到首记录
fetchfirstfromV_CURSORinto@id,@name
select@idasid,@nameasname
--定位到尾记录
fetchlastfromV_CURSORinto@id,@name
select@idasid,@nameasname
CLOSEV_CURSOR;
DEALLOCATEV_CURSOR;
-------------------------------------------------------------------------------------
/*
*/
-------------------------------------------------------------------------------------
DECLARE@IDBIGINT;
DECLARE@NAMENVARCHAR(50);
DECLAREV_CURSORCURSORSCROLLFOR(
SELECTV_ID,V_NameFROMV_TESTWHERERIGHT(V_NAME,2)='10'
)
OPENV_CURSOR;
FETCHNEXTFROMV_CURSORINTO@ID,@NAME
WHILE(@@FETCH_STATUS=0)
BEGIN
PRINTCAST(@IDASNVARCHAR)+@NAME;
FETCHRELATIVE2FROMV_CURSORINTO@ID,@NAME;
END
CLOSEV_CURSOR;
DEALLOCATEV_CURSOR;
-------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
/*
dynamic表示可以读写游标(否则游标只读)
UPDATEV_TESTSETV_DESC='Victor199'WHERECURRENTOFV_CURSOR
*/
-------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
DECLAREV_CURSORCURSORSCROLLDYNAMIC
/*scroll表示可随意移动游标指针(否则只能向前)
dynamic表示可以读写游标(否则游标只读)*/
FOR
SELECTV_DESCFROMV_TESTWHERECAST(RIGHT(V_DESC,3)ASINT)<200
OPENV_CURSOR
DECLARE@DESCNVARCHAR(50)
FETCHNEXTFROMV_CURSORINTO@DESC
WHILE(@@fetch_status=0)
BEGIN
PRINT'ProductName:
'+@DESC
FETCHNEXTFROMV_CURSORINTO@DESC
END
FETCHFIRSTFROMV_CURSORINTO@DESC
print@DESC
updateV_TESTsetV_DESC='123122'WHERECURRENTOFV_CURSOR
/**//*deletefromproductwherecurrentofmy_cursor*/
CLOSEV_CURSOR
DEALLOCATEV_CURSOR
----------------------------------------------------------------
SELECT*FROMV_TEST
updateV_TESTsetV_DESC='Victor199'WHEREV_ID=801
---------------------------------------------------------------------------
---------------------------------------------------------------------------
---------------------------------------------------------------------------
/*
declaremy_cursor1cursorfor
selectnContentId,dtEditTimefromcontentwheredatepart(month,dtEditTime)='9'anddatepart(day,dtEditTime)='26'
openmy_cursor1
declare@datesysname
declare@nIDsysname
declare@tempDatedatetime
fetchnextfrommy_cursor1into@nID,@date
while(@@fetch_status=0)
begin
set@tempDate=dateadd(day,87,@date)
--print@tempDate
updateContentsetdtEditTime=@tempDatewherenContentId=@nID
fetchnextfrommy_cursor1into@nID,@date
end
closemy_cursor1
deallocatemy_cursor1
*/
-----------------------
DECLARE@JJNVARCHAR(10)
SET@JJ='12345';
SET@JJ=RIGHT(@JJ,LEFT(@JJ,1))
PRINT@JJ
----------------------