Bagikan melalui


Mensimulasikan Pernyataan Pembaruan dan Penghapusan yang Diposisikan

Jika sumber data tidak mendukung pernyataan pembaruan dan penghapusan yang diposisikan, driver dapat mensimulasikan ini. Misalnya, pustaka kursor ODBC mensimulasikan pernyataan pembaruan dan penghapusan yang diposisikan. Strategi umum untuk mensimulasikan pernyataan pembaruan dan penghapusan yang diposisikan adalah mengonversi pernyataan yang diposisikan ke pernyataan yang dicari. Ini dilakukan dengan mengganti klausa WHERE CURRENT OF dengan klausa WHERE yang dicari yang mengidentifikasi baris saat ini.

Misalnya, karena kolom CustID secara unik mengidentifikasi setiap baris dalam tabel Pelanggan, pernyataan penghapusan yang diposisikan

DELETE FROM Customers WHERE CURRENT OF CustCursor  

mungkin dikonversi ke

DELETE FROM Customers WHERE (CustID = ?)  

Driver dapat menggunakan salah satu pengidentifikasi baris berikut dalam klausa WHERE:

  • Kolom yang nilainya berfungsi untuk mengidentifikasi secara unik setiap baris dalam tabel. Misalnya, memanggil SQLSpecialColumns dengan SQL_BEST_ROWID mengembalikan kolom atau kumpulan kolom optimal yang melayani tujuan ini.

  • Kolom semu, disediakan oleh beberapa sumber data, untuk tujuan mengidentifikasi setiap baris secara unik. Ini juga dapat diambil dengan memanggil SQLSpecialColumns.

  • Indeks unik, jika tersedia.

  • Semua kolom dalam tataan hasil.

Persis kolom mana yang harus digunakan driver dalam klausa WHERE yang dibangunnya tergantung pada driver. Pada beberapa sumber data, menentukan pengidentifikasi baris bisa mahal. Namun, lebih cepat untuk menjalankan dan menjamin bahwa pernyataan yang disimulasikan memperbarui atau menghapus paling banyak satu baris. Bergantung pada kemampuan DBMS yang mendasar, menggunakan pengidentifikasi baris bisa mahal untuk disiapkan. Namun, lebih cepat untuk menjalankan dan menjamin bahwa pernyataan simulasi akan memperbarui atau menghapus hanya satu baris. Opsi untuk menggunakan semua kolom dalam tataan hasil biasanya jauh lebih mudah disiapkan. Namun, lebih lambat untuk dijalankan dan, jika kolom tidak mengidentifikasi baris secara unik, dapat mengakibatkan baris diperbarui atau dihapus secara tidak sengaja, terutama ketika daftar pemilihan untuk kumpulan hasil tidak berisi semua kolom yang ada dalam tabel yang mendasar.

Tergantung pada strategi mana yang didukung driver sebelumnya, aplikasi dapat memilih strategi mana yang ingin digunakan driver dengan atribut pernyataan SQL_ATTR_SIMULATE_CURSOR. Meskipun mungkin tampak aneh bagi aplikasi untuk berisiko secara tidak sengaja memperbarui atau menghapus baris, aplikasi dapat menghapus risiko ini dengan memastikan bahwa kolom dalam kumpulan hasil secara unik mengidentifikasi setiap baris dalam tataan hasil. Ini menyelamatkan pengemudi upaya harus melakukan ini.

Jika driver memilih untuk menggunakan pengidentifikasi baris, driver akan mencegat pernyataan SELECT FOR UPDATE yang membuat tataan hasil. Jika kolom dalam daftar pilih tidak secara efektif mengidentifikasi baris, driver menambahkan kolom yang diperlukan ke akhir daftar pemilihan. Beberapa sumber data memiliki satu kolom yang selalu secara unik mengidentifikasi baris, seperti kolom ROWID di Oracle; jika kolom seperti itu tersedia, driver menggunakan ini. Jika tidak, driver memanggil SQLSpecialColumns untuk setiap tabel dalam klausul FROM untuk mengambil daftar kolom yang secara unik mengidentifikasi setiap baris. Pembatasan umum yang dihasilkan dari teknik ini adalah bahwa simulasi kursor gagal jika ada lebih dari satu tabel dalam klausa FROM .

Tidak peduli bagaimana driver mengidentifikasi baris, biasanya menghapus klausul FOR UPDATE OF dari pernyataan SELECT FOR UPDATE sebelum mengirimkannya ke sumber data. Klausa FOR UPDATE OF hanya digunakan dengan pernyataan pembaruan dan penghapusan yang diposisikan. Sumber data yang tidak mendukung pernyataan pembaruan dan penghapusan yang diposisikan umumnya tidak mendukungnya.

Ketika aplikasi mengirimkan pernyataan pembaruan atau penghapusan yang diposisikan untuk eksekusi, driver mengganti klausa WHERE CURRENT OF dengan klausa WHERE yang berisi pengidentifikasi baris. Nilai kolom ini diambil dari cache yang dikelola oleh driver untuk setiap kolom yang digunakan dalam klausa WHERE . Setelah driver mengganti klausa WHERE , driver mengirimkan pernyataan ke sumber data untuk dieksekusi.

Misalnya, aplikasi mengirimkan pernyataan berikut untuk membuat tataan hasil:

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

Jika aplikasi telah menetapkan SQL_ATTR_SIMULATE_CURSOR untuk meminta jaminan keunikan dan jika sumber data tidak menyediakan kolom pseudo yang selalu secara unik mengidentifikasi baris, driver memanggil SQLSpecialColumns untuk tabel Pelanggan, menemukan bahwa CustID adalah kunci untuk tabel Pelanggan dan menambahkan ini ke daftar pilihan, dan menghapus klausul FOR UPDATE OF :

SELECT Name, Address, Phone, CustID FROM Customers  

Jika aplikasi belum meminta jaminan keunikan, driver hanya menghapus klausa FOR UPDATE OF :

SELECT Name, Address, Phone FROM Customers  

Misalkan aplikasi menggulir melalui kumpulan hasil dan mengirimkan pernyataan pembaruan yang diposisikan berikut untuk eksekusi, di mana Cust adalah nama kursor di atas kumpulan hasil:

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

Jika aplikasi belum meminta jaminan keunikan, driver menggantikan klausa WHERE dan mengikat parameter CustID ke variabel dalam cache-nya:

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

Jika aplikasi belum meminta jaminan keunikan, driver menggantikan klausa WHERE dan mengikat parameter Nama, Alamat, dan Telepon dalam klausul ini ke variabel dalam cache-nya:

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