`
uule
  • 浏览: 6359375 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

什么是游标

阅读更多

游标和游标的优点:

 

   在数据库中,游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,
   游标实际上是一种从包括多条数据记录的结果集中每次提取一条记录的机制。
   游标总是与一条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];
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO


-- =============================================
CREATE PROCEDURE [GetRelatedAirport]
(@cityCode char(3)='', @apCodeList varchar(50) OUTPUT)
WITH 
EXECUTE AS CALLER
AS
BEGIN
	-- 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 = @cityCode
	OPEN FILTER_CURSOR

	DECLARE @apcode char(3)
	DECLARE @filterfetch int
	FETCH FIRST FROM FILTER_CURSOR INTO @apcode
	SET @filterfetch = @@FETCH_STATUS
	WHILE @filterfetch = 0
		BEGIN
			IF @apCodeList = ''
				SET @apCodeList = @apcode
			Else
				SET @apCodeList = @apCodeList + ',' + @apcode
 
			FETCH NEXT FROM FILTER_CURSOR INTO @apcode
			SET @filterfetch = @@FETCH_STATUS
		END
	CLOSE FILTER_CURSOR
	DEALLOCATE FILTER_CURSOR
	
	IF @apCodeList = ''
		SET @apCodeList = @cityCode
	--select @apCodeList
END
GO

 

 

含有事物和异常的游标:

OPEN FILTER_CURSOR

	BEGIN TRY
		BEGIN TRANSACTION 
		FETCH FIRST FROM FILTER_CURSOR INTO @id
		SET @filterfetch = @@FETCH_STATUS
		WHILE @filterfetch = 0
			BEGIN
			   ......
			FETCH NEXT FROM FILTER_CURSOR INTO @id
				SET @filterfetch = @@FETCH_STATUS
			END		
		SET @success = 1
		COMMIT TRANSACTION
	END TRY
	BEGIN CATCH
		PRINT 'errno: ' + ltrim(str(error_number()))
		PRINT 'errmsg: ' + error_message()
		IF @@TRANCOUNT > 0
			ROLLBACK TRANSACTION 
		SET @success = 0
	END CATCH

CLOSE FILTER_CURSOR
DEALLOCATE FILTER_CURSOR
END
GO

  。。。

 

分享到:
评论

相关推荐

    18.什么是游标.md

    18.什么是游标.md

    SQL游标使用金典

    在深入探讨SQL游标的使用之前,我们先来了解一下什么是游标。游标是数据库管理系统的功能之一,它允许用户逐行处理查询结果集中的数据。通常情况下,当我们执行一个SELECT语句时,整个结果集会被一次性返回给应用...

    游标例题 获取游标中的某一行

    1. **什么是游标?** 游标(Cursor)是一种数据库对象,它允许我们遍历查询结果集,一次处理一行数据。游标提供了前进、后退、移动到特定位置甚至修改当前行的能力,为复杂的数据处理提供了灵活性。 2. **声明游标...

    关于游标的说明与使用方法

    #### 一、什么是游标? 在数据库技术中,**游标**是一种用于检索查询结果集中的数据的方式。它允许用户逐行处理记录集,而不是一次处理整个记录集。这使得游标成为处理大量数据时的一个非常有用的功能。 #### 二、...

    jdbcTemplate分页彻底解决,使用游标滚动

    首先,我们要理解什么是游标滚动。在数据库中,游标允许我们从结果集中顺序地读取一行数据,也可以向前或向后移动,甚至可以在当前行上进行修改。游标滚动对于处理大量数据尤其有用,因为它可以在不一次性加载所有...

    多个ORACLE 游标+SQL 游标 小例子+帮助文档

    首先,我们要明白什么是游标。游标(Cursor)是一个数据库系统组件,它允许我们在查询结果集中移动,一次处理一行数据。这在处理大量数据时特别有用,尤其是当我们需要对每一行进行特定操作,或者我们无法一次性加载...

    sql存储过程和游标的运用

    什么是游标 游标是一种可以遍历结果集的机制,它可以让开发者逐行处理查询结果。游标可以分为两种:隐式游标和显式游标。隐式游标是指在查询语句中隐式地使用游标,而显式游标是指在查询语句中明确地声明游标。 ...

    使用游标与过程实现排名

    首先,我们来理解什么是游标(Cursor)。游标是数据库管理系统中的一个概念,它允许我们按需逐行处理查询结果。在Oracle中,游标可以视为一个指针,指向查询结果集中的当前行,并允许我们读取、修改或删除这一行数据...

    sql 游标遍历 实例

    首先,让我们理解什么是游标。游标可以视为一个指针,它在查询结果集上移动,允许你逐行访问数据。在大多数关系型数据库管理系统(如MySQL、SQL Server、Oracle等)中,都支持游标的使用。游标的创建、打开、读取、...

    数据库游标的使用数据库游标的使用.doc

    2. 什么是游标? 游标是与一条select语句相关联的,它由select查询语句的结果集和结果集中指向特定记录的游标位置组成。游标允许我们逐行地读取查询结果集,并对每一行记录进行操作。 3. 怎么使用游标? 使用游标...

    fgdb_游标查找_游标实现数据库创建_

    首先,让我们了解什么是游标。在数据库术语中,游标(Cursor)是一个编程概念,它允许程序逐行处理数据库查询结果。游标提供了在结果集中向前或向后移动的能力,这使得我们可以按需处理每一行数据,而不是一次性加载...

    14.SQL游标概览.doc

    什么是游标? 游标可以被看作是一个指向结果集(活动集)中的某一行(当前行)的指针。通过游标,开发者能够逐行访问查询结果,进行诸如读取、更新或删除等操作。游标机制使得数据能够在客户端(应用程序)和...

    面向 海量 分布式数据库 游标构造.7z

    首先,我们需要理解什么是游标。游标(Cursor)是数据库管理系统(DBMS)提供的一种机制,用于在结果集中定位和移动,以便于应用程序按需处理每一行数据。游标有多种类型,如只进、可退、可滚动等,每种类型支持不同...

    波形图游标功能_获取游标_

    首先,我们要理解“游标”是什么。在图形用户界面中,游标通常表现为可移动的标记,用于指示数据的特定位置。在波形图中,游标可以用来读取特定时间点的信号幅度,或者同时在多个波形之间进行比较。 设置波形图的...

    什么是oracle 游标

    游标在Oracle数据库中扮演着至关重要的角色,它允许开发者以一种交互式的方式处理查询结果集,逐条处理数据,而不是一次性加载所有记录。游标本质上是一个指针,它可以指向结果集中的任意一条记录,使得程序员能够...

    游标的使用

    简单明了的用实际语句介绍什么是游标及游标的操作

    LabVIEW 的游标图例

    游标图例用来显示图形中的游标,如图1所示。在图形上用游标可读取绘图区域上某个点的确切值,游标值会显示在游标图例中。  图1 图形缩放方式  图2 游标图例  选择游标图例右键快捷菜单的“创建游标”,在...

Global site tag (gtag.js) - Google Analytics