Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dynamiczny kursor jest właśnie taki: dynamiczny. Może wykryć wszelkie zmiany wprowadzone w członkostwie, kolejności i wartości zestawu wyników po otwarciu kursora. Załóżmy na przykład, że kursor dynamiczny pobiera dwa wiersze, a inna aplikacja następnie aktualizuje jeden z tych wierszy i usuwa drugi. Jeśli kursor dynamiczny podejmie próbę ponownego pobrania tych wierszy, nie znajdzie usuniętego wiersza, ale zwróci nowe wartości zaktualizowanego wiersza.
Kursory dynamiczne wykrywają wszystkie aktualizacje, usuwają i wstawiają zarówno własne, jak i te, które zostały wprowadzone przez inne osoby. (Podlega to poziomowi izolacji transakcji ustawionemu przez atrybut połączenia SQL_ATTR_TXN_ISOLATION). Tablica stanu wiersza określona przez atrybut instrukcji SQL_ATTR_ROW_STATUS_PTR odzwierciedla te zmiany i może zawierać SQL_ROW_SUCCESS, SQL_ROW_SUCCESS_WITH_INFO, SQL_ROW_ERROR, SQL_ROW_UPDATED i SQL_ROW_ADDED. Nie może zwrócić SQL_ROW_DELETED, ponieważ kursor dynamiczny nie zwraca usuniętych wierszy poza zestawem wierszy i dlatego nie rozpoznaje już istnienia usuniętego wiersza w zestawie wyników lub odpowiadającym mu elementowi w tablicy stanu wiersza. SQL_ROW_ADDED jest zwracany tylko wtedy, gdy wiersz jest aktualizowany przez wywołanie funkcji SQLSetPos, a nie po zaktualizowaniu go przez inny kursor.
Jednym ze sposobów implementowania dynamicznych kursorów w bazie danych jest utworzenie selektywnego indeksu definiującego członkostwo i kolejność zestawu wyników. Ponieważ indeks jest aktualizowany po wprowadzeniu zmian przez inne osoby, kursor oparty na takim indeksie jest wrażliwy na wszystkie zmiany. Dodatkowy wybór w zestawie wyników zdefiniowanym przez ten indeks jest możliwy przez przetwarzanie zgodnie z indeksem.
Dynamiczne kursory można symulować, wymagając, aby zestaw wyników był uporządkowany za pomocą unikatowego klucza. Przy takim ograniczeniu pobieranie jest wykonywane przez wykonanie instrukcji SELECT za każdym razem, gdy kursor pobiera wiersze. Załóżmy na przykład, że zestaw wyników jest zdefiniowany przez następującą instrukcję:
SELECT * FROM Customers ORDER BY Name, CustID
Aby pobrać następny zestaw wierszy w tym zestawie wyników, symulowany kursor ustawia parametry w następującej instrukcji SELECT na wartości w ostatnim wierszu bieżącego zestawu wierszy, a następnie wykonuje go:
SELECT * FROM Customers WHERE (Name > ?) AND (CustID > ?)
ORDER BY Name, CustID
Ta instrukcja tworzy drugi zestaw wyników, z którego pierwszy zestaw wierszy jest następnym zestawem wierszy w oryginalnym zestawie wyników — w tym przypadku zestaw wierszy w tabeli Customers. Kursor zwraca ten zestaw wierszy do aplikacji.
Warto zauważyć, że kursor dynamiczny zaimplementowany w ten sposób faktycznie tworzy wiele zestawów wyników, co pozwala wykrywać zmiany w oryginalnym zestawie wyników. Aplikacja nigdy nie uczy się istnienia tych pomocniczych zestawów wyników; po prostu pojawia się tak, jakby kursor mógł wykryć zmiany w oryginalnym zestawie wyników.