Cursors sind Datenbankobjekte, mit denen Sie von einem von einer SQL -Abfrage zurückgegebenen Ergebnis auf Daten zu einem Zeitpunkt auf Daten zugreifen und sie nacheinander manipulieren können. Stellen Sie sich sie als Zeiger vor, die in einem Ergebnissatz durch die Zeilen navigieren.
Hier ist eine Aufschlüsselung dessen, was sie sind und warum sie verwendet werden:
Schlüsselkonzepte:
* Ergebnissatz: Eine Sammlung von Zeilen, die von einer SQL -Abfrage zurückgegeben wurden. Wenn Sie eine `select` -Anweisung ausführen, generiert der Datenbankserver einen Ergebnissatz.
* Zeilen-für-Reis-Verarbeitung: Mit Cursors können Sie jede Zeile des Ergebniseinsatzes einzeln abrufen und verarbeiten. Dies steht im Gegensatz zu Standard -SQL -Operationen, die normalerweise auf dem gesamten Ergebnis gleichzeitig arbeiten.
* Zeiger/Iterator: Ein Cursor fungiert im Wesentlichen als Zeiger oder Iterator, der den Zugriff auf die aktuelle Zeile verfolgt. Sie können den Cursor nach vorne bewegen, um auf nachfolgende Zeilen zuzugreifen.
Warum Cursors verwenden?
Cursors werden im Allgemeinen verwendet, wenn Sie in jeder Zeile eines Ergebnissatzes komplexe Operationen ausführen müssen, die mit Standard -SQL -Anweisungen schwierig oder unmöglich zu erreichen sind. Gemeinsame Szenarien umfassen:
* Bedingte Updates/Löschungen: Möglicherweise müssen Sie eine Zeile basierend auf Werten aktualisieren oder löschen, die in anderen Zeilen derselben Ergebnismenge oder in anderen Tabellen gefunden werden.
* Berechnungen basierend auf früheren Zeilen: Möglicherweise müssen Sie einen laufenden Gesamt-, gleitenden Durchschnitt oder einen anderen kumulativen Wert berechnen, der von den Werten in den vorhergehenden Zeilen abhängt.
* Integration in externe Systeme: Möglicherweise müssen Sie Daten aus einer Datenbank abrufen und diese Daten dann verwenden, um mit externen Anwendungen oder APIs zu interagieren und jede Zeile einzeln zu verarbeiten.
* komplexe Logik innerhalb gespeicherter Prozeduren: Cursoren werden häufig in gespeicherten Verfahren verwendet, wenn Sie eine komplexe Geschäftslogik implementieren müssen, die eine Iterierung durch einen Ergebnissatz erfordert.
* Berichterstattung: Das Generieren von benutzerdefinierten Berichten oder die Ausführung komplexer Datenformatierung basiert häufig auf der Verarbeitung von Zeilen für Reihen.
Wie Cursors funktionieren (vereinfacht):
1. den Cursor deklarieren: Sie deklarieren zunächst einen Cursor und geben die Anweisung "SELECT" an, mit der das Ergebnis festgelegt wird, mit dem der Cursor funktioniert.
2. Öffnen Sie den Cursor: Das Öffnen des Cursors führt die Anweisung "Select" aus und erstellt das Ergebnissatz. Der Cursor ist vor der ersten Reihe positioniert.
3. Zeilen abrufen: Sie verwenden eine "Fetch` -Anweisung", um die Daten aus der aktuellen Zeile abzurufen und den Cursor in die nächste Zeile zu verschieben.
4. die Daten verarbeiten: In einer Schleife verarbeiten Sie die von jeder Zeile abgerufenen Daten. Dies kann die Aktualisierung anderer Tabellen, die Durchführung von Berechnungen oder das Aufrufen externer Verfahren beinhalten.
5. den Cursor schließen: Nachdem Sie alle Zeilen verarbeitet haben, schließen Sie den Cursor und geben die von ihm verwendeten Ressourcen frei.
6. Umlangen Sie den Cursor: Schließlich haben Sie den Cursor ausgetauscht.
Beispiel (konzeptionelle - spezifische Syntax variiert je nach Datenbank):
`` `SQL
- einen Cursor deklarieren
Deklarieren Sie My_Cursor Cursor für
Wählen Sie Mitarbeiter, Gehalt von Mitarbeitern, wobei Abteilung_ID =10;
- Öffnen Sie den Cursor
Öffnen Sie My_Cursor;
- Die erste Reihe holen
Nächst von my_cursor in @EMP_ID, @Salary;
- Schleife durch das Ergebnissatz
Während @@ fetch_status =0 - prüfen Sie, ob der Abruf erfolgreich war
BEGINNEN
- Verarbeiten Sie die Daten (Beispiel:Heben Sie das Gehalt an, wenn Sie unter einem Schwellenwert unterwegs sind).
Wenn @salary <50000
BEGINNEN
Update -Mitarbeiter setzen Gehalt =Gehalt * 1.10 wobei Mitarbeiter_id =@emp_id; - Erhöhen Sie das Gehalt um 10%
ENDE;
- Die nächste Reihe holen
Nächst von my_cursor in @EMP_ID, @Salary;
ENDE;
- Schließen Sie den Cursor
Schließen Sie My_Cursor;
- Umlangen Sie den Cursor
Deaktivieren my_cursor;
`` `
Wichtige Überlegungen und Nachteile:
* Leistungsauswirkungen: Cursoren können deutlich langsamer sein als SET-basierte SQL-Operationen, insbesondere wenn es sich um große Ergebnissätze handelt. Die Zeilen-für-Reihen-Verarbeitung ist von Natur aus weniger effizient als die Verarbeitungsdaten in Stapeln. Versuchen Sie nach Möglichkeit, Ihr gewünschtes Ergebnis mit Standard -SQL -Abfragen zu erzielen.
* Komplexität: Cursors können Ihren Code komplexer und zu pflegen.
* Sperrprobleme: Cursor können Sperrungen für Datenbankressourcen für längere Zeiträume halten und möglicherweise zu Streit- und Leistungsproblemen führen.
* Alternativen: Erforschen Sie vor dem Rückgang zu Cursors Alternativen wie:
* set-basierte SQL-Operationen: Oft können Sie das gleiche Ergebnis mit einer cleveren SQL -Abfrage erzielen.
* gespeicherte Verfahren mit temporären Tabellen: Erstellen Sie eine temporäre Tabelle, um den Zwischenergebnissatz zu halten, und führen Sie dann Vorgänge in der temporären Tabelle durch.
* Anwendung Code (z. B. Python, Java), um die Daten zu verarbeiten: Rufen Sie das gesamte Ergebnis in Ihre Anwendung ab und führen Sie dort die Zeilen-für-Reihen-Verarbeitung durch. Dies kann manchmal effizienter sein als die Verwendung von Cursors.
Zusammenfassend sind Cursors ein leistungsstarkes, aber oft weniger effizientes Werkzeug für die Verarbeitung von Zeilen für Reihen in Datenbanken. Verwenden Sie sie nur bei Bedarf und berücksichtigen Sie die Auswirkungen auf die Leistung sorgfältig. Bemühen Sie sich nach Möglichkeit, SET-basierte SQL-Operationen zu verwenden.