一、游標的作用:
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