1. Die Rolle des Cursors:
Beim Auswählen wird ein Ergebnissatz zurückgegeben. Wenn Sie während des Rückgabevorgangs des Ergebnissatzes eine Datenzeile lesen müssen. Diese Datenzeile muss verarbeitet werden, z. B. die Rückgabe einer Abfrageergebnismenge basierend auf den gelesenen Daten als Abfragebedingungen usw. Die Anwendung muss einen Cursor verwenden.
Mit Cursorn können Benutzer die nächste Zeile, vorherige Zeile, erste Zeile oder letzte Zeile abfragen und diese gelesenen Zeilen verarbeiten.
2. Cursor-Beispiel
FUNKTION ERSTELLEN GetMRPlnFullBom – Erstellen Sie eine Funktion, um jede Zeile im Dokument basierend auf dem Dokumentschlüssel abzufragen und die Daten in jeder Zeile zu verarbeiten.
(
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 @Itm ID varchar(50) , @ Qty int ,@LineNum int ,@ObjType int --Deklarieren Sie lokale Variablen
--Deklarieren Sie einen Cursor, @ kann nicht vor XXX hinzugefügt werden, wie zum Beispiel der folgenden MRPlnA_ItmID, das Format ist DECLARE XXX CURSOR FOR
DECLARE MRPlnA_ItmID CURSOR FOR
SELECT ItmID , Qty ,LineNum , ObjType FROM MRPlnA Where DocEntry = @DocEntry – Die Anweisung muss zwischen DECLARE XXX CURSOR FOR und OPEN XXX stehen.
Open MRPlnA_ItmID --Öffnen Sie den Cursor
FETCH NEXT FROM MRPlnA_ItmID INTO @ItmID , @Qty ,@LineNum , @ObjType --FETCH NEXT FROM XXX INTO ... Aktualisieren Sie den Cursor-Spezifikationsdatensatz und wrap und speichern Sie die ausgewählten Daten in temporären Variablen. Das FETCH-Format umfasst neben NEXT auch PRIOR, FRIST und LAST. Dies sind die vorherige Zeile, die erste Zeile und die letzte Zeile.
WHILE @@FETCH_STATUS = 0 --@@FETCH_STATUS globale Variable, wird verwendet, um den letzten Status von FETCH abzufragen und die Schleife zu steuern. Er ist 0, wenn der Lesevorgang abgeschlossen ist, -1, wenn der Lesevorgang fehlschlägt, und -2, wenn der Datensatz gelöscht wird.
BEGIN
Einfügen in @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 ist eine weitere Abfragefunktion.
FETCH NEXT FROM MRPlnA_ItmID INTO @ItmID , @Qty ,@LineNum , @ObjType – Select bewegt sich zur nächsten Zeile.
ENDE
CLOSE MRPlnA_ItmID – Cursor schließen
DEALLOCATE MRPlnA_ItmID – Cursor loslassen
RETURN
ENDE