Dynamische ODBC-Cursor

Ein dynamischer Cursor ist nur das: dynamisch. Sie kann alle Änderungen erkennen, die an der Mitgliedschaft, Reihenfolge und den Werten des Resultsets vorgenommen wurden, nachdem der Cursor geöffnet wurde. Angenommen ein dynamischer Cursor ruft zwei Zeilen ab, und eine andere Anwendung aktualisiert daraufhin eine dieser Zeilen und löscht die andere. Wenn der dynamische Cursor dann versucht, diese Zeilen zurückzugeben, wird die gelöschte Zeile nicht gefunden, sondern die neuen Werte für die aktualisierte Zeile zurückgegeben.

Dynamische Cursor erkennen alle Aktualisierungen, Lösch- und Einfügungen, sowohl ihre eigenen als auch die von anderen Personen vorgenommenen. (Dies unterliegt der Isolationsstufe der Transaktion, wie durch das SQL_ATTR_TXN_ISOLATION-Verbindungsattribute festgelegt.) Das durch das attribut der SQL_ATTR_ROW_STATUS_PTR-Anweisung angegebene Zeilenstatusarray gibt diese Änderungen wieder und kann SQL_ROW_SUCCESS, SQL_ROW_SUCCESS_WITH_INFO, SQL_ROW_ERROR, SQL_ROW_UPDATED und SQL_ROW_ADDED enthalten. Es kann SQL_ROW_DELETED nicht zurückgegeben werden, da ein dynamischer Cursor keine gelöschten Zeilen außerhalb des Rowsets zurückgibt und daher das Vorhandensein der gelöschten Zeile im Resultset oder das entsprechende Element im Zeilenstatusarray nicht mehr erkennt. SQL_ROW_ADDED wird nur zurückgegeben, wenn eine Zeile von einem Aufruf von SQLSetPos aktualisiert wird, nicht wenn sie von einem anderen Cursor aktualisiert wird.

Eine Möglichkeit zum Implementieren dynamischer Cursor in der Datenbank besteht darin, einen selektiven Index zu erstellen, der die Mitgliedschaft und Reihenfolge des Resultsets definiert. Da der Index aktualisiert wird, wenn andere Änderungen vornehmen, ist ein Cursor, der auf einem solchen Index basiert, für alle Änderungen vertraulich. Zusätzliche Auswahl innerhalb des durch diesen Index definierten Resultsets ist durch Die Verarbeitung entlang des Indexes möglich.

Dynamische Cursor können simuliert werden, indem das Resultset durch einen eindeutigen Schlüssel sortiert werden muss. Mit einer solchen Einschränkung werden Abrufe vorgenommen, indem eine SELECT-Anweisung jedes Mal ausgeführt wird, wenn der Cursor Zeilen abruft. Angenommen, das Resultset wird durch diese Anweisung definiert:

SELECT * FROM Customers ORDER BY Name, CustID  

Um das nächste Rowset in diesem Resultset abzurufen, legt der simulierte Cursor die Parameter in der folgenden SELECT-Anweisung auf die Werte in der letzten Zeile des aktuellen Rowsets fest und führt es dann aus:

SELECT * FROM Customers WHERE (Name > ?) AND (CustID > ?)  
   ORDER BY Name, CustID  

Diese Anweisung erstellt ein zweites Resultset, das erste Rowset, dessen nächstes Rowset im ursprünglichen Resultset ist – in diesem Fall die Gruppe von Zeilen in der Tabelle "Kunden". Der Cursor gibt dieses Rowset an die Anwendung zurück.

Es ist interessant zu beachten, dass ein dynamischer Cursor, der auf diese Weise implementiert wurde, tatsächlich viele Resultsets erstellt, wodurch änderungen am ursprünglichen Resultset erkannt werden können. Die Anwendung lernt nie das Vorhandensein dieser Hilfsergebnissätze; es erscheint einfach so, als ob der Cursor Änderungen am ursprünglichen Resultset erkennen kann.