一、游标的作用:
Select时,返回的是一个结果集,若需要为结果集返回的过程中,读取到一行数据。需要对此行数据进行处理,比如按读取到的数据作为查询条件返回一个查询结果集等等,应用都需要用到游标。
游标可允许 用户 查询下一行、上一行、第一行或最后一行,并对这些读取到的行进行处理。
二、游标举例
CREATE FUNCTION GetMRPlnFullBom --创建一函数,根据单据电键查询单据中每行,并对每行数据进行处理。 ( @DocEntry int ) RETURNS @TAB TABLE -- 将最终查询的结果集定义临时表,返回。 ( DocEntry int, LineNum int, LineNumLevel nvarchar(100), ItmID nvarchar(20), ItmName nvarchar(100), LineType char(1), Qty numeric(19,9), BomLevel int, ParentEntry int, ParentItmID nvarchar(20), TopEntry int, TopItmID nvarchar(20) , BaseEntry int , BaseLineNum int , BaseType int ) AS BEGIN Declare @ItmID varchar(50) , @Qty int ,@LineNum int ,@ObjType int --声明局部变量 --声明一游标,声明游标时 XXX前不能加@,比如下面的MRPlnA_ItmID ,格式是DECLARE XXX CURSOR FOR DECLARE MRPlnA_ItmID CURSOR FOR SELECT ItmID , Qty ,LineNum , ObjType FROM MRPlnA Where DocEntry = @DocEntry --语句要在DECLARE XXX CURSOR FOR与OPEN XXX之间。 Open MRPlnA_ItmID --打开游标 FETCH NEXT FROM MRPlnA_ItmID INTO @ItmID , @Qty ,@LineNum , @ObjType --FETCH NEXT FROM XXX INTO ... 更新游标指定记录即换行,并将Select出来的数据,存入临时变量中。 FETCH格式上除了NEXT还有PRIOR、FRIST、LAST。分别是上一行、第一行及最后一行。 WHILE @@FETCH_STATUS = 0 --@@FETCH_STATUS全局变量,用于查询FETCH最后一次状态,控制循环。当读取完时是0,读取失败是-1,记录被删除是-2。 BEGIN Insert Into @TAB Select DocEntry,LineNum,LineNumLevel,ItmID,ItmName,LineType,Qty*@Qty,BomLevel,ParentEntry, ParentItmID,TopEntry,TopItmID , @DocEntry SourceEntry ,@LineNum BaseLineNum ,@ObjType BaseType From GetBomFullItems(@ItmID, 'V 1.0', GetDate()) TD --GetBomFULLItmes是另一查询函数。 FETCH NEXT FROM MRPlnA_ItmID INTO @ItmID , @Qty ,@LineNum , @ObjType -- Select移到下一行。 END CLOSE MRPlnA_ItmID --关闭游标 DEALLOCATE MRPlnA_ItmID --释放游标 RETURN END
参考:https://www.cnblogs.com/moss_tan_jun/archive/2011/11/26/2263988.html