游标和游标的优点:
在数据库中,游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,
游标实际上是一种从包括多条数据记录的结果集中每次提取一条记录的机制。
游标总是与一条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
在深入探讨SQL游标的使用之前,我们先来了解一下什么是游标。游标是数据库管理系统的功能之一,它允许用户逐行处理查询结果集中的数据。通常情况下,当我们执行一个SELECT语句时,整个结果集会被一次性返回给应用...
1. **什么是游标?** 游标(Cursor)是一种数据库对象,它允许我们遍历查询结果集,一次处理一行数据。游标提供了前进、后退、移动到特定位置甚至修改当前行的能力,为复杂的数据处理提供了灵活性。 2. **声明游标...
#### 一、什么是游标? 在数据库技术中,**游标**是一种用于检索查询结果集中的数据的方式。它允许用户逐行处理记录集,而不是一次处理整个记录集。这使得游标成为处理大量数据时的一个非常有用的功能。 #### 二、...
首先,我们要理解什么是游标滚动。在数据库中,游标允许我们从结果集中顺序地读取一行数据,也可以向前或向后移动,甚至可以在当前行上进行修改。游标滚动对于处理大量数据尤其有用,因为它可以在不一次性加载所有...
首先,我们要明白什么是游标。游标(Cursor)是一个数据库系统组件,它允许我们在查询结果集中移动,一次处理一行数据。这在处理大量数据时特别有用,尤其是当我们需要对每一行进行特定操作,或者我们无法一次性加载...
什么是游标 游标是一种可以遍历结果集的机制,它可以让开发者逐行处理查询结果。游标可以分为两种:隐式游标和显式游标。隐式游标是指在查询语句中隐式地使用游标,而显式游标是指在查询语句中明确地声明游标。 ...
首先,我们来理解什么是游标(Cursor)。游标是数据库管理系统中的一个概念,它允许我们按需逐行处理查询结果。在Oracle中,游标可以视为一个指针,指向查询结果集中的当前行,并允许我们读取、修改或删除这一行数据...
首先,让我们理解什么是游标。游标可以视为一个指针,它在查询结果集上移动,允许你逐行访问数据。在大多数关系型数据库管理系统(如MySQL、SQL Server、Oracle等)中,都支持游标的使用。游标的创建、打开、读取、...
2. 什么是游标? 游标是与一条select语句相关联的,它由select查询语句的结果集和结果集中指向特定记录的游标位置组成。游标允许我们逐行地读取查询结果集,并对每一行记录进行操作。 3. 怎么使用游标? 使用游标...
首先,让我们了解什么是游标。在数据库术语中,游标(Cursor)是一个编程概念,它允许程序逐行处理数据库查询结果。游标提供了在结果集中向前或向后移动的能力,这使得我们可以按需处理每一行数据,而不是一次性加载...
什么是游标? 游标可以被看作是一个指向结果集(活动集)中的某一行(当前行)的指针。通过游标,开发者能够逐行访问查询结果,进行诸如读取、更新或删除等操作。游标机制使得数据能够在客户端(应用程序)和...
首先,我们需要理解什么是游标。游标(Cursor)是数据库管理系统(DBMS)提供的一种机制,用于在结果集中定位和移动,以便于应用程序按需处理每一行数据。游标有多种类型,如只进、可退、可滚动等,每种类型支持不同...
首先,我们要理解“游标”是什么。在图形用户界面中,游标通常表现为可移动的标记,用于指示数据的特定位置。在波形图中,游标可以用来读取特定时间点的信号幅度,或者同时在多个波形之间进行比较。 设置波形图的...
游标在Oracle数据库中扮演着至关重要的角色,它允许开发者以一种交互式的方式处理查询结果集,逐条处理数据,而不是一次性加载所有记录。游标本质上是一个指针,它可以指向结果集中的任意一条记录,使得程序员能够...
简单明了的用实际语句介绍什么是游标及游标的操作
游标图例用来显示图形中的游标,如图1所示。在图形上用游标可读取绘图区域上某个点的确切值,游标值会显示在游标图例中。 图1 图形缩放方式 图2 游标图例 选择游标图例右键快捷菜单的“创建游标”,在...