什么是游标
来源:互联网 发布:淘宝网雅迪电动车价格 编辑:程序博客网 时间: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
。。。
- 什么是游标?
- 什么是游标
- 什么是游标
- 什么是游标
- 什么是游标
- 什么是游标。游标使用示例。
- 理解什么是游标,什么是指针
- 什么是数据库游标?
- 什么是SQL游标?
- 什么是 REF游标
- [摘]什么是游标(cursor)?
- 游标
- 游标
- 游标
- 游标
- 游标
- 游标
- 游标
- 使用Table的insertRow实现某一模块的复制
- MFC中定时器使用实例
- Struts2的用法之一
- 存储过程
- 冒泡排序(Bubble Sort)
- 什么是游标
- ubuntu python3.5配置MySQL
- jdk8新特性之流
- SSH框架
- 利用存储过程将Excel中数据导入到数据库表中
- 本地git仓库推送到服务器自建的git仓库实现目录文件同步教程[自整理]
- tomcat命令
- JSP中循环二维数组 + 循环Map
- vultr升降级:老5美元降级到2.5美元VPS套餐教程