Dieses Beispiel verwendet eine einfache Abfrage, um zu illustrieren, wie verschiedene Cursor auf eine Zeile in der Ergebnismenge reagieren, die gelöscht wird.
Es gibt die folgende Abfolge von Ereignissen:
Eine Anwendung öffnet in der Beispieldatenbank in der folgenden Abfrage einen Cursor.
SELECT EmployeeID, Surname FROM Employees ORDER BY EmployeeID; |
EmployeeID | Surname |
---|---|
102 | Whitney |
105 | Cobb |
160 | Breault |
... | ... |
Die Anwendung ruft die erste Zeile durch den Cursor ab (102).
Die Anwendung ruft die nächste Zeile durch den Cursor ab (105).
Eine weitere Anwendung löscht Mitarbeiter 102 (Whitney) und schreibt die Änderung fest.
In dieser Situation hängen die Ergebnisse der Cursor-Aktionen von der Cursor-Sensitivität ab.
Insensitive Cursor Das DELETE wird weder in der Mitgliedschaft noch in den Werten der Ergebnisse, wie sie durch den Cursor gesehen werden, widergespiegelt:
Maßnahme | Ergebnis |
---|---|
Vorherige Zeile abrufen | Gibt die ursprüngliche Kopie der Zeile zurück (102). |
Erste Zeile abrufen (absoluter Abruf) | Gibt die ursprüngliche Kopie der Zeile zurück (102). |
Zweite Zeile abrufen (absoluter Abruf) | Gibt die ungeänderte Zeile zurück (105). |
Sensitive Cursor Die Mitgliedschaft der Ergebnismenge hat sich insofern geändert, dass jetzt Zeile 105 die erste Zeile in der Ergebnismenge ist:
Maßnahme | Ergebnis |
---|---|
Vorherige Zeile abrufen | Gibt Zeile nicht gefunden zurück. Es gibt keine vorherige Zeile.
|
Erste Zeile abrufen (absoluter Abruf) | Gibt Zeile 105 zurück. |
Zweite Zeile abrufen (absoluter Abruf) | Gibt Zeile 160 zurück. |
Wertsensitive Cursor Die Mitgliedschaft der Ergebnismenge ist unveränderlich, und daher ist Zeile 105 weiterhin die zweite Zeile in der Ergebnismenge. Das DELETE wird in den Werten des Cursors widergespiegelt und erzeugt ein tatsächliches Loch in der Ergebnismenge.
Maßnahme | Ergebnis |
---|---|
Vorherige Zeile abrufen | Gibt Keine aktuelle Cursorzeile zurück. Wo vorher die erste Zeile war, steht jetzt im Cursor eine Lücke.
|
Erste Zeile abrufen (absoluter Abruf) | Gibt Keine aktuelle Cursorzeile zurück. Wo vorher die erste Zeile war, steht jetzt im Cursor eine Lücke.
|
Zweite Zeile abrufen (absoluter Abruf) | Gibt Zeile 105 zurück. |
Asensitive Cursor In Bezug auf Änderungen sind Mitgliedschaft und Werte der Ergebnismenge unbestimmt. Die Antwort auf einen Abruf der vorherigen Zeile, der ersten Zeile oder der zweiten Zeile hängt von der entsprechenden Optimierungsmethode für die Abfrage ab, nämlich ob die Methode die Erstellung einer Arbeitstabelle erfordert und ob die abgerufene Zeile vom Client vorab abgerufen wurde.
Der Vorteil von asensitiven Cursor liegt darin, dass für viele Anwendungen die Sensitivität unwichtig ist. Besonders wenn Sie einen nur lesenden Vorwärtscursor verwenden, sind keine der darunter liegenden Änderungen sichtbar. Auch wenn Sie auf einer hohen Isolationsstufe ausführen, sind darunter liegende Änderungen nicht zulässig.
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2013, SAP AG oder ein SAP-Konzernunternehmen. - SAP Sybase SQL Anywhere 16.0 |