Aracılığıyla paylaş


Konumlanmış Güncelleme ve Silme İfadelerinin Simülasyonunu Yapma

Veri kaynağı konumlanmış güncelleştirme ve silme deyimlerini desteklemiyorsa, sürücü bunların benzetimini yapabilir. Örneğin, ODBC imleç kitaplığı konumlanmış güncelleştirme ve silme deyimlerinin simülasyonunu oluşturur. Konumlandırılmış güncelleştirme ve silme deyimlerinin benzetimini yapmak için genel strateji, konumlandırılmış deyimleri aranan deyimlere dönüştürmektir. Bu işlem, WHERE CURRENT OF yan tümcesinin, geçerli satırı tanımlayan aranan bir WHERE yan tümcesiyle değiştirilmesiyle yapılır.

Örneğin, CustID sütunu Customers tablosundaki her satırı benzersiz olarak tanımladığından, konumlu silme deyimi

DELETE FROM Customers WHERE CURRENT OF CustCursor  

olarak dönüştürülebilir

DELETE FROM Customers WHERE (CustID = ?)  

Sürücü WHERE yan tümcesinde aşağıdaki satır tanımlayıcılarından birini kullanabilir:

  • Değerleri tablodaki her satırı benzersiz olarak tanımlamaya hizmet eden sütunlar. Örneğin, SQL_BEST_ROWID ile SQLSpecialColumns çağrılması, bu amaca hizmet eden en uygun sütunu veya sütun kümesini döndürür.

  • Bazı veri kaynakları tarafından sağlanan sahte sütunlar, her satırı benzersiz olarak tanımlamak için kullanılır. Bunlar SQLSpecialColumns çağrılarak da alınabilir.

  • Varsa benzersiz bir dizin.

  • Sonuç kümesindeki tüm sütunlar.

Bir sürücünün, oluşturacağı WHERE yan tümcesinde tam olarak hangi sütunları kullanması gerektiği sürücüye bağlıdır. Bazı veri kaynaklarında satır tanımlayıcısı belirlemek maliyetli olabilir. Ancak, daha hızlı yürütülür ve bir simülasyon deyiminin en fazla bir satırda güncelleştirildiğini veya silindiğini garanti eder. Temel alınan DBMS'nin özelliklerine bağlı olarak, satır tanımlayıcısının kurulması pahalı olabilir. Ancak, daha hızlı yürütülür ve bir simülasyon deyiminin yalnızca bir satırı güncelleştireceğini veya sileceğini garanti eder. Sonuç kümesindeki tüm sütunları kullanma seçeneği genellikle çok daha kolaydır. Ancak, yürütülmesi daha yavaştır ve sütunlar bir satırı benzersiz olarak tanımlamıyorsa, özellikle sonuç kümesinin seçme listesi temel alınan tabloda bulunan tüm sütunları içermediğinde satırların istemeden güncelleştirilmesi veya silinmesine neden olabilir.

Sürücünün desteklediği önceki stratejilerden hangisini desteklediğine bağlı olarak, bir uygulama sürücünün SQL_ATTR_SIMULATE_CURSOR deyimi özniteliğiyle hangi stratejiyi kullanmasını istediğini seçebilir. Bir uygulamanın istemeden bir satırı güncelleştirme veya silme riski olsa da, uygulama sonuç kümesindeki sütunların sonuç kümesindeki her satırı benzersiz olarak tanımlamasını sağlayarak bu riski kaldırabilir. Bu, sürücünün bu işi yapmasına gerek kalmadan zaman ve çaba tasarrufu sağlar.

Sürücü bir satır tanımlayıcısı kullanmayı seçerse sonuç kümesini oluşturan SELECT FOR UPDATE deyimini durdurur. Seçme listesindeki sütunlar bir satırı etkili bir şekilde tanımlamazsa, sürücü gerekli sütunları seçme listesinin sonuna ekler. Bazı veri kaynakları, Oracle'daki ROWID sütunu gibi bir satırı her zaman benzersiz olarak tanımlayan tek bir sütuna sahiptir; böyle bir sütun varsa, sürücü bunu kullanır. Aksi takdirde, sürücü HER satırı benzersiz olarak tanımlayan sütunların listesini almak için FROM yan tümcesindeki her tablo için SQLSpecialColumns çağırır. Bu teknikten kaynaklanan yaygın bir kısıtlama, FROM yan tümcesinde birden fazla tablo varsa imleç benzetiminin başarısız olmasıdır.

Sürücü satırları nasıl tanımlarsa tanımlasın, genellikle FOR UPDATE OF yan tümcesini veri kaynağına göndermeden önce SELECT FOR UPDATE deyiminden çıkartır. FOR UPDATE OF yan tümcesi yalnızca konumlanmış güncelleştirme ve silme deyimleriyle kullanılır. Konumlanmış güncelleştirme ve silme deyimlerini desteklemeyen veri kaynakları genellikle bunu desteklemez.

Uygulama yürütme için konumlandırılmış bir güncelleştirme veya silme deyimi gönderdiğinde, sürücü WHERE CURRENT OF koşulunu, satır tanımlayıcısını içeren WHERE yan tümcesiyle değiştirir. Bu sütunların değerleri , WHERE yan tümcesinde kullandığı her sütun için sürücü tarafından tutulan bir önbellekten alınır. Sürücü WHERE yan tümcesini değiştirdikten sonra, deyimini yürütülmek üzere veri kaynağına gönderir.

Örneğin, uygulamanın bir sonuç kümesi oluşturmak için aşağıdaki deyimi gönderdiğini varsayalım:

SELECT Name, Address, Phone FROM Customers FOR UPDATE OF Phone, Address  

Uygulama benzersizlik garantisi istemek için SQL_ATTR_SIMULATE_CURSOR ayarladıysa ve veri kaynağı her zaman benzersiz bir satır tanımlayan bir sahte sütun sağlamazsa, sürücü Müşteriler tablosu için SQLSpecialColumns'u çağırır, CustID'nin Müşteriler tablosunun anahtarı olduğunu bulur ve bunu seçme listesine ekler. ve FOR UPDATE OF yan tümcesini şeritler:

SELECT Name, Address, Phone, CustID FROM Customers  

Uygulama benzersizlik garantisi istemediyse, sürücü yalnızca FOR UPDATE OF yan tümcesini çıkarır.

SELECT Name, Address, Phone FROM Customers  

Uygulamanın sonuç kümesi içinde gezinip yürütme için aşağıdaki konumlanmış güncelleştirme ifadesini gönderdiğini varsayalım; burada Cust, sonuç kümesi üzerinde imlecin adıdır:

UPDATE Customers SET Address = ?, Phone = ? WHERE CURRENT OF Cust  

Uygulama benzersizlik garantisi istemediyse, sürücü WHERE yan tümcesini değiştirir ve CustID parametresini önbelleğindeki değişkene bağlar:

UPDATE Customers SET Address = ?, Phone = ? WHERE (CustID = ?)  

Uygulama benzersizlik garantisi istemediyse, sürücü WHERE yan tümcesinin yerini alır ve bu yan tümcedeki Ad, Adres ve Telefon parametrelerini önbelleğindeki değişkenlere bağlar:

UPDATE Customers SET Address = ?, Phone = ?  
   WHERE (Name = ?) AND (Address = ?) AND (Phone = ?)