Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 (Deutsch) » SQL Anywhere Server - Programmierung » Anwendungsentwicklung mit SQL » SQL Anywhere-Cursor

 

Beispiel für Cursor-Sensitivität: Eine gelöschte Zeile

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:

  1. 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
    ... ...
  2. Die Anwendung ruft die erste Zeile durch den Cursor ab (102).

  3. Die Anwendung ruft die nächste Zeile durch den Cursor ab (105).

  4. 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.