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

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - Programmierung » Einführung in die Programmierung mit SQL Anywhere » SQL in Anwendungen verwenden » SQL Anywhere-Cursor

 

Wertempfindliche Cursor

Bei wertempfindlichen Cursorn ist die Mitgliedschaft unbestimmt und die Reihenfolge und der Wert der Ergebnismenge empfindlich.

Wertempfindliche Cursor können für schreibgeschützte oder aktualisierbare Cursortypen verwendet werden.

Standards

Wertempfindliche Cursor entsprechen keiner ISO/ANSI-Standarddefintion. Sie entsprechen den Keyset-gesteuerten ODBC-Cursor.

Programmierschnittstellen
Schnittstelle Cursortyp Kommentar
ODBC, ADO/OLE DB Keyset-gesteuert
Embedded SQL SCROLL
JDBC INSENSITIVE und CONCUR_UPDATABLE Beim iAnywhere JDBC-Treiber wird eine Anforderung eines INSENSITIVE Cursors mit einem wert-empfindlichen Cursor beantwortet.
Open Client und jConnect Nicht unterstützt
Beschreibung

Wenn eine Anwendung eine Zeile abruft, die aus einer darunter liegenden geänderten Basiszeile besteht, dann muss der Anwendung der aktualisierte Wert sowie die SQL_ROW_UPDATED-Statusmeldung übermittelt werden. Wenn die Anwendung versucht, eine Zeile abzurufen, die aus einer darunter liegenden Basiszeile zusammengesetzt war, welche gelöscht worden ist, muss eine SQL_ROW_DELETED-Statusmeldung an die Anwendung übermittelt werden.

Eine Änderung am Primärschlüsselwert entfernt die Zeile aus der Ergebnismenge (dies wird als Löschen, gefolgt von Einfügen, behandelt). Ein Sonderfall tritt auf, wenn eine Zeile in der Ergebnismenge gelöscht wird (durch den Cursor oder von auswärts), und eine neue Zeile mit demselben Schlüsselwert eingefügt wird. Das führt dazu, dass die neue Zeile die alte Zeile in der ursprünglichen Position ersetzt.

Es gibt keine Garantie, dass die Zeilen in der Ergebnismenge dem Reihenfolgen- oder Auswahlkriterium der Abfrage entsprechen. Da die Zeilenmitgliedschaft zum Zeitpunkt des Öffnens festgelegt wird, führen nachfolgende Änderungen, durch die eine Zeile nicht mehr der WHERE- oder ORDER BY-Klausel entspricht, nicht dazu, dass sich die Mitgliedschaft oder Position einer Zeile ändert.

Alle Werte sind in Bezug auf Änderungen, die durch den Cursor durchgeführt werden, empfindlich. Die Empfindlichkeit der Mitgliedschaft gegenüber Änderungen, die durch den Cursor ausgeführt werden, wird durch die ODBC-Option SQL_STATIC_SENSITIVITY gesteuert. Wenn diese Option auf ON eingestellt ist, fügen Einfügungen durch den Cursor die Zeile dem Cursor hinzu. Ansonsten ist sie nicht in der Ergebnismenge enthalten. Löschungen durch den Cursor entfernen die Zeile aus der Ergebnismenge, wodurch eine Lücke vermieden wird, und geben die SQL_ROW_DELETED-Statusmeldung zurück.

Wertempfindliche Cursor verwenden eine Keyset-Tabelle. Wenn der Cursor geöffnet wird, füllt SQL Anywhere eine Arbeitstabelle mit Kenndaten für jede Zeile an, die zur Ergebnismenge beiträgt. Wenn Sie die Ergebnismenge durchblättern, wird die Keyset-Tabelle zur Identifizierung der Mitgliedschaft der Ergebnismenge verwendet, aber die Daten werden, falls erforderlich, von den darunter liegenden Tabellen bezogen.

Die Eigenschaft der festen Mitgliedschaft von wertempfindlichen Cursor ermöglicht es Ihrer Anwendung, sich an die Zeilenpositionen innerhalb eines Cursors zu erinnern, und stellt sicher, dass diese Positionen nicht geändert werden. Weitere Hinweise finden Sie unter Beispiel für Cursor-Empfindlichkeit: Eine gelöschte Zeile.

  • Wenn eine Zeile seit dem Öffnen des Cursors aktualisiert beziehungsweise möglicherweise aktualisiert wurde, gibt SQL Anywhere die Warnung SQLE_ROW_UPDATED_WARNING zurück, wenn die Zeile abgerufen wird. Die Warnung wird nur einmal ausgegeben: Ein weiteres Abrufen der Zeile generiert keine Warnmeldung.

    Eine Aktualisierung einer beliebigen Spalte in der Zeile verursacht diese Warnung sogar, wenn die aktualisierte Spalte nicht durch den Cursor referenziert wird. Ein Cursor auf Surname und GivenName würde beispielsweise die Aktualisierung melden, selbst wenn nur die Birthdate-Spalte geändert worden wäre. Diese Warn- und Fehlerbedingungen bei Aktualisierung treten nicht im Massenvorgangsmodus (Option -b für Datenbankserver) auf, wenn die Zeilensperre deaktiviert ist. Weitere Hinweise finden Sie unter Performance-Aspekte von Massenvorgängen und Zeile wurde seit dem letzten Lesen aktualisiert.

  • Der Versuch, eine positionsbasierte UPDATE- oder DELETE-Anweisung auf einer Zeile auszuführen, die seit dem letzten Abruf geändert wurde, gibt den SQLE_ROW_UPDATED_SINCE_READ-Fehler aus und bricht die Anweisung ab. Eine Anwendung muss die Zeile noch einmal mit FETCH ABRUFEN, bevor das UPDATE oder DELETE zugelassen wird.

    Eine Aktualisierung einer beliebigen Spalte in der Zeile verursacht diesen Fehler. Dies ist sogar dann der Fall, wenn die aktualisierte Spalte nicht durch den Cursor referenziert wird. Der Fehler tritt nicht im Massenvorgangsmodus auf. Weitere Hinweise finden Sie unter Zeile seit dem letzten Lesen geändert - Vorgang abgebrochen.

  • Wenn eine Zeile, entweder durch den Cursor oder durch eine andere Transaktion, nach dem Öffnen des Cursors gelöscht wurde, entsteht im Cursor eine Lücke. Die Mitgliedschaft des Cursors steht fest, daher ist die Position einer Zeile reserviert, aber der DELETE-Vorgang wird im geänderten Wert für die Zeile wiedergespiegelt. Wenn Sie die Zeile an dieser Lücke abrufen, wird mit der Fehlermeldung Keine aktuelle Cursorzeile darauf hingewiesen, dass es keine aktuelle Zeile gibt, und der Cursor wird auf der Lücke belassen. Sie können Lücken vermeiden, indem Sie empfindliche Cursor verwenden, da sich deren Mitgliedschaft zusammen mit den Werten verändert. Weitere Hinweise finden Sie unter Keine aktuelle Cursorzeile.

Sie können für wertempfindliche Cursor Zeilen nicht vorab abrufen. Diese Einschränkung kann sich manchmal auf die Performance auswirken.

Mehrere Zeilen einfügen

Wenn Sie mehrere Zeilen über einen wertsensitiven Cursor einfügen, erscheinen die neuen Zeilen am Ende der Ergebnismenge. Weitere Hinweise finden Sie unter Zeilen mit einen Cursor ändern.