cursor游标.docx

上传人:b****1 文档编号:2168816 上传时间:2023-05-02 格式:DOCX 页数:6 大小:16.83KB
下载 相关 举报
cursor游标.docx_第1页
第1页 / 共6页
cursor游标.docx_第2页
第2页 / 共6页
cursor游标.docx_第3页
第3页 / 共6页
cursor游标.docx_第4页
第4页 / 共6页
cursor游标.docx_第5页
第5页 / 共6页
cursor游标.docx_第6页
第6页 / 共6页
亲,该文档总共6页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

cursor游标.docx

《cursor游标.docx》由会员分享,可在线阅读,更多相关《cursor游标.docx(6页珍藏版)》请在冰点文库上搜索。

cursor游标.docx

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

----------------------

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2