什么是游标

来源:互联网 发布:淘宝网雅迪电动车价格 编辑:程序博客网 时间:2024/06/06 04:35

游标和游标的优点:

 

   在数据库中,游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,
   游标实际上是一种从包括多条数据记录的结果集中每次提取一条记录的机制。
   游标总是与一条SQL选择语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。

 

 游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果
 用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理

   我们知道关系数据库管理系统实质是面向集合的,在MS SQL SERVER 中并没有一种描述表中单一记录的表达形式,除非使用where子句来限制只有一条记录被选中。因此我们必须借助于游标来进行面向单条记录的数据处理。由此可见,
   游标允许应用程序对查询语句select返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;它还提供对基于游标位置而对表中数据进行删除或更新的能力;
   而且,正是游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。


  游标是对数据集的顺序循环,在一些特定的情况下,是非常有作用的,但是游标的效率是一个大的问题;但是如果数据表中有几十万或者更大量的数据时,游标的效率是要考虑的。因为游标相当于在这么大的表中不停地查找,直到你想要的结果,实际上与你一个特征一个特征地取数据是一样的,只是那样子你也穷举无数种可能,而游标在这种情况下会按一种你定义的规则自动进行。

 

创建游标:
declare cursor1 CURSOR
FOR
Select * from table1

 

DECLARE   Employee_Cursor   CURSOR
FOR
SELECT   LastName,   FirstName   FROM   Northwind.dbo.Employees
OPEN   Employee_Cursor
FETCH   NEXT   FROM   Employee_Cursor
WHILE   @@FETCH_STATUS   =   0
BEGIN
      FETCH   NEXT   FROM   Employee_Cursor
END
CLOSE   Employee_Cursor
DEALLOCATE   Employee_Cursor

 

在存储过程中使用游标:

CREATE PROCEDURE Proc_Syn_Data
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @ID varchar(50);
DECLARE @Name varchar(100);
DECLARE @keyID varchar(50);
DECLARE @updatetime varchar(50);

1.声明游标

    DECLARE CUR_MonthID CURSOR FOR
   SELECT SchoolID,SName FROM dbo.GK_SchoolInfo
DECLARE CUR_MonthID2 CURSOR FOR
  SELECT RAreasID,UpdateTime FROM dbo.GK_ResiAreasInfo
2.打开游标
    OPEN CUR_MonthID
 OPEN CUR_MonthID2
3.从一个游标中查找信息 ,实现自己的数据处理。

 

FETCH CUR_MonthID

         INTO @ID,@Name
FETCH CUR_MonthID2

      INTO @keyID,@updatetime
WHILE @@FETCH_STATUS=0
BEGIN
SELECT @ID=SchoolID,@Name=SName FROM dbo.GK_SchoolInfo
SELECT @keyID=RAreasID,@updatetime=UpdateTime FROM dbo.GK_ResiAreasInfo
FETCH NEXT FROM CUR_MonthID INTO @ID,@Name
FETCH NEXT FROM CUR_MonthID2 INTO @keyID,@updatetime
print('---'+@ID+'---'+@Name+'|---|'+@keyID+'****'+@updatetime)
    END;
 4.关闭游标
    CLOSE CUR_MonthID;
 CLOSE CUR_MonthID2;
 5.释放游标
   deallocate CUR_MonthID;
 DEALLOCATE CUR_MonthID2;
 END;

exec Proc_Syn_Data;

 

@@FETCH_STATUS
返回被   FETCH   语句执行的最后游标的状态
0   FETCH   语句成功。 
-1   FETCH   语句失败或此行不在结果集中。 
-2   被提取的行不存在。

由于 @@FETCH_STATUS 对于在一个连接上的所有游标都是全局性的,所以要谨慎使用 @@FETCH_STATUS。在执行一条 FETCH 语句后,必须在对另一游标执行另一 FETCH 语句前测试 @@FETCH_STATUS。在此连接上出现任何提取操作之前,@@FETCH_STATUS 的值没有定义。
例如,用户从一个游标执行一条 FETCH 语句,然后调用一个存储过程,此存储过程打开并处理另一个游标的结果。从被调用的存储过程返回控制后,@@FETCH_STATUS 反映的是在存储过程中执行的最后的 FETCH 语句的结果,而不是在存储过程被调用之前的 FETCH 语句的结果。

 

 

使用游标在存储过程中循环遍历数据:

 

CREATE PROCEDURE updatecount AS
   DECLARE @flashID int
   DECLARE favCounts CURSOR LOCAL SCROLL FOR
         SELECT flashID  FROM flashs_Favorites

OPEN favCounts
FETCH NEXT FROM favCounts INTO @flashID 
/* 读取第1行数据*/

WHILE @@FETCH_STATUS = 0
BEGIN
    update flashtable set favCount=favcount + 1 where flashID=@flashID
    FETCH NEXT FROM favCounts INTO @flashID
END
CLOSE  favCounts
DEALLOCATE favCounts
GO

 

USE [AirRateMgt];GOSET ANSI_NULLS ON;GOSET QUOTED_IDENTIFIER ON;GO-- =============================================CREATE PROCEDURE [GetRelatedAirport](@cityCode char(3)='', @apCodeList varchar(50) OUTPUT)WITH EXECUTE AS CALLERASBEGIN-- SET NOCOUNT ON added to prevent extra result sets from-- interfering with SELECT statements.SET NOCOUNT ON;SET @apCodeList = ''    DECLARE FILTER_CURSOR CURSOR DYNAMIC FOR select AP.AirportCode from Airports as AP where AP.CityCode = @cityCodeOPEN FILTER_CURSORDECLARE @apcode char(3)DECLARE @filterfetch intFETCH FIRST FROM FILTER_CURSOR INTO @apcodeSET @filterfetch = @@FETCH_STATUSWHILE @filterfetch = 0BEGINIF @apCodeList = ''SET @apCodeList = @apcodeElseSET @apCodeList = @apCodeList + ',' + @apcode FETCH NEXT FROM FILTER_CURSOR INTO @apcodeSET @filterfetch = @@FETCH_STATUSENDCLOSE FILTER_CURSORDEALLOCATE FILTER_CURSORIF @apCodeList = ''SET @apCodeList = @cityCode--select @apCodeListENDGO

 

 

含有事物和异常的游标:

OPEN FILTER_CURSORBEGIN TRYBEGIN TRANSACTION FETCH FIRST FROM FILTER_CURSOR INTO @idSET @filterfetch = @@FETCH_STATUSWHILE @filterfetch = 0BEGIN   ......FETCH NEXT FROM FILTER_CURSOR INTO @idSET @filterfetch = @@FETCH_STATUSENDSET @success = 1COMMIT TRANSACTIONEND TRYBEGIN CATCHPRINT 'errno: ' + ltrim(str(error_number()))PRINT 'errmsg: ' + error_message()IF @@TRANCOUNT > 0ROLLBACK TRANSACTION SET @success = 0END CATCHCLOSE FILTER_CURSORDEALLOCATE FILTER_CURSORENDGO

  。。。

 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 9个月宝宝便秘怎么办 六个月宝宝严重便秘怎么办 公司调岗员工不同意怎么办 acca注册一直在审核怎么办 ieee ap二审被拒怎么办 文章投到假期刊怎么办 论文投了假网站怎么办 网上传了虚假的怎么办? 网上做兼职被骗了钱怎么办 通过支付宝扫码被骗了怎么办 支付宝扫二维码被骗怎么办 在is上被骗了怎么办 微信兼职被骗怎么办天涯论坛 公众号不给稿费怎么办 围绕服务改善民生提出怎么办 翰墨香林苑怎么办全产权 西城高铁联名卡怎么办 英语教学系统做题时超时了怎么办 sci被要求撤稿怎么办 论文投稿后初审通过想撤稿怎么办 河南大学读写译挂了怎么办 在职mba双证硕士怎么办户口 电脑开机了出现一些英文单词怎么办 不懂法语想读法语书怎么办 大鱼号文章需要修改怎么办 过了上诉期怎么办申诉 法院判刑后被告逃亡监护人怎么办 二审判决后不服的怎么办 对树木对生物花草过敏怎么办 高一英语成绩差怎么办 文章被同时录用该怎么办 来不及开ei检索证明怎么办 淘宝生产许可编号一定要填怎么办 官网下单被砍单怎么办美卡美私 大学网络课程挂了怎么办 如果二审超过6个月还不判怎么办? sci的proof时间超了怎么办 合肥电大考试没过怎么办 社保账号密码忘记了怎么办 住房公积金账号密码忘记了怎么办 燃气费单子丢了怎么办