Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Jeśli źródło danych nie obsługuje instrukcji aktualizacji i usuwania, sterownik może je symulować. Na przykład biblioteka kursorów ODBC symuluje umieszczone instrukcje aktualizacji i usuwania. Ogólną strategią symulacji instrukcji aktualizacji i usuwania jest konwertowanie instrukcji pozycyjnych na wyszukiwane. W tym celu należy zastąpić klauzulę WHERE CURRENT OF przeszukaną klauzulą WHERE , która identyfikuje bieżący wiersz.
Na przykład, ponieważ kolumna CustID jednoznacznie identyfikuje każdy wiersz w tabeli Klienci, umieszczona instrukcja usuwania
DELETE FROM Customers WHERE CURRENT OF CustCursor
może zostać przekonwertowany na
DELETE FROM Customers WHERE (CustID = ?)
Sterownik może użyć jednego z następujących identyfikatorów wierszy w klauzuli WHERE :
Kolumny, których wartości służą do identyfikowania unikatowo każdego wiersza w tabeli. Na przykład wywołanie funkcji SQLSpecialColumns za pomocą SQL_BEST_ROWID zwraca optymalną kolumnę lub zestaw kolumn, które służą temu celowi.
Pseudo-kolumny dostarczane przez niektóre źródła danych w celu unikatowego identyfikowania każdego wiersza. Może to być również możliwe do pobrania przez wywołanie metody SQLSpecialColumns.
Unikatowy indeks, jeśli jest dostępny.
Wszystkie kolumny w zestawie wyników.
Dokładnie które kolumny sterownik powinien uwzględnić podczas konstruowania klauzuli WHERE, zależy od sterownika. W niektórych źródłach danych określenie identyfikatora wiersza może być kosztowne. Jednak szybsze jest wykonywanie i gwarantuje, że symulowana instrukcja aktualizuje lub usuwa co najwyżej jeden wiersz. W zależności od możliwości bazowego systemu DBMS skonfigurowanie przy użyciu identyfikatora wiersza może być kosztowne. Jednak szybsze jest wykonywanie i gwarantuje, że symulowana instrukcja zaktualizuje lub usunie tylko jeden wiersz. Opcja używania wszystkich kolumn w zestawie wyników jest zwykle znacznie łatwiejsza do skonfigurowania. Jednak wykonywanie jest wolniejsze, a jeśli kolumny nie identyfikują unikatowo wiersza, mogą spowodować niezamierzone zaktualizowanie lub usunięcie wierszy, zwłaszcza gdy lista wyboru zestawu wyników nie zawiera wszystkich kolumn, które istnieją w tabeli bazowej.
W zależności od tego, które z powyższych strategii obsługuje sterownik, aplikacja może wybrać strategię, która ma być używana przez sterownik z atrybutem instrukcji SQL_ATTR_SIMULATE_CURSOR. Chociaż może się wydawać dziwne, że aplikacja ryzykuje przypadkowo aktualizowanie lub usuwanie wiersza, aplikacja może usunąć to ryzyko, zapewniając, że kolumny w zestawie wyników jednoznacznie identyfikują każdy wiersz w zestawie wyników. Pozwala to zaoszczędzić kierowcy nakład pracy, aby to zrobić.
Jeśli sterownik zdecyduje się użyć identyfikatora wiersza, przechwytuje instrukcję SELECT FOR UPDATE, która tworzy zestaw wyników. Jeśli kolumny na liście wyboru nie identyfikują skutecznie wiersza, sterownik dodaje niezbędne kolumny na końcu listy wyboru. Niektóre źródła danych mają jedną kolumnę, która zawsze jednoznacznie identyfikuje wiersz, taki jak kolumna ROWID w oracle; jeśli taka kolumna jest dostępna, sterownik używa tej funkcji. W przeciwnym razie sterownik wywołuje funkcję SQLSpecialColumns dla każdej tabeli w klauzuli FROM , aby pobrać listę kolumn, które jednoznacznie identyfikują każdy wiersz. Typowym ograniczeniem wynikam tej techniki jest to, że symulacja kursora kończy się niepowodzeniem, jeśli istnieje więcej niż jedna tabela w klauzuli FROM .
Niezależnie od tego, jak sterownik identyfikuje wiersze, zwykle usuwa klauzulę FOR UPDATE OF z instrukcji SELECT FOR UPDATE przed wysłaniem go do źródła danych. Klauzula FOR UPDATE OF jest używana tylko z instrukcjami aktualizacji i usuwania. Źródła danych, które nie obsługują instrukcji aktualizacji i usuwania, zwykle ich nie obsługują.
Gdy aplikacja przesyła pozycjonowaną instrukcję aktualizacji lub usuwania do wykonania, sterownik zastępuje klauzulę WHERE CURRENT OF klauzulą WHERE zawierającą identyfikator wiersza. Wartości tych kolumn są pobierane z pamięci podręcznej obsługiwanej przez sterownik dla każdej kolumny używanej w klauzuli WHERE . Po zastąpieniu klauzuli WHERE sterownik wysyła instrukcję do źródła danych do wykonania.
Załóżmy na przykład, że aplikacja przesyła następującą instrukcję, aby utworzyć zestaw wyników:
SELECT Name, Address, Phone FROM Customers FOR UPDATE OF Phone, Address
Jeśli aplikacja ustawiła SQL_ATTR_SIMULATE_CURSOR, aby żądać gwarancji unikatowości i jeśli źródło danych nie udostępnia pseudokolumny, która zawsze jednoznacznie identyfikuje wiersz, sterownik wywołuje funkcję SQLSpecialColumns dla tabeli Customers, odkrywa, że CustID jest kluczem tej tabeli i dodaje go do listy wyboru, po czym usuwa klauzulę FOR UPDATE OF.
SELECT Name, Address, Phone, CustID FROM Customers
Jeśli aplikacja nie zażądała gwarancji unikatowości, sterownik usuwa tylko klauzulę FOR UPDATE OF :
SELECT Name, Address, Phone FROM Customers
Załóżmy, że aplikacja przewija zestaw wyników i przesyła do wykonania następującą instrukcję aktualizacji na określonej pozycji, gdzie Cust jest nazwą kursora nad zestawem wyników.
UPDATE Customers SET Address = ?, Phone = ? WHERE CURRENT OF Cust
Jeśli aplikacja nie zażądała gwarancji unikatowości, sterownik zastępuje klauzulę WHERE i wiąże parametr CustID ze zmienną w pamięci podręcznej:
UPDATE Customers SET Address = ?, Phone = ? WHERE (CustID = ?)
Jeśli aplikacja nie zażądała gwarancji unikatowości, sterownik zastępuje klauzulę WHERE i wiąże parametry Name, Address i Phone w tej klauzuli do zmiennych w pamięci podręcznej:
UPDATE Customers SET Address = ?, Phone = ?
WHERE (Name = ?) AND (Address = ?) AND (Phone = ?)