Kursor Dinamis ODBC

Kursor dinamis hanyalah: dinamis. Ini dapat mendeteksi perubahan apa pun yang dilakukan pada keanggotaan, pesanan, dan nilai hasil yang ditetapkan setelah kursor dibuka. Misalnya, kursor dinamis mengambil dua baris dan aplikasi lain kemudian memperbarui salah satu baris tersebut dan menghapus baris lainnya. Jika kursor dinamis kemudian mencoba mengambil ulang baris tersebut, kursor tidak akan menemukan baris yang dihapus tetapi akan mengembalikan nilai baru untuk baris yang diperbarui.

Kursor dinamis mendeteksi semua pembaruan, penghapusan, dan penyisipan, baik sendiri maupun yang dibuat oleh orang lain. (Ini tunduk pada tingkat isolasi transaksi, seperti yang ditetapkan oleh atribut koneksi SQL_ATTR_TXN_ISOLATION.) Array status baris yang ditentukan oleh atribut pernyataan SQL_ATTR_ROW_STATUS_PTR mencerminkan perubahan ini dan dapat berisi SQL_ROW_SUCCESS, SQL_ROW_SUCCESS_WITH_INFO, SQL_ROW_ERROR, SQL_ROW_UPDATED, dan SQL_ROW_ADDED. Ini tidak dapat mengembalikan SQL_ROW_DELETED karena kursor dinamis tidak mengembalikan baris yang dihapus di luar set baris dan karena itu tidak lagi mengenali keberadaan baris yang dihapus dalam kumpulan hasil atau elemen yang sesuai dalam array status baris. SQL_ROW_ADDED dikembalikan hanya ketika baris diperbarui oleh panggilan ke SQLSetPos, bukan saat diperbarui oleh kursor lain.

Salah satu cara menerapkan kursor dinamis dalam database adalah dengan membuat indeks selektif yang menentukan keanggotaan dan urutan kumpulan hasil. Karena indeks diperbarui ketika orang lain membuat perubahan, kursor berdasarkan indeks tersebut sensitif terhadap semua perubahan. Pilihan tambahan dalam tataan hasil yang ditentukan oleh indeks ini dimungkinkan dengan memproses di sepanjang indeks.

Kursor dinamis dapat disimulasikan dengan mengharuskan tataan hasil diurutkan oleh kunci unik. Dengan pembatasan seperti itu, pengambilan dibuat dengan menjalankan pernyataan SELECT setiap kali kursor mengambil baris. Misalnya, misalkan kumpulan hasil ditentukan oleh pernyataan ini:

SELECT * FROM Customers ORDER BY Name, CustID  

Untuk mengambil kumpulan baris berikutnya dalam kumpulan hasil ini, kursor yang disimulasikan mengatur parameter dalam pernyataan SELECT berikut ke nilai di baris terakhir dari set baris saat ini, lalu menjalankannya:

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

Pernyataan ini membuat tataan hasil kedua, kumpulan baris pertama yang merupakan set baris berikutnya dalam tataan hasil asli - dalam hal ini, kumpulan baris dalam tabel Pelanggan. Kursor mengembalikan set baris ini ke aplikasi.

Menarik untuk dicatat bahwa kursor dinamis yang diterapkan dengan cara ini benar-benar membuat banyak tataan hasil, yang memungkinkannya mendeteksi perubahan pada tataan hasil asli. Aplikasi tidak pernah mempelajari keberadaan tataan hasil tambahan ini; itu hanya muncul seolah-olah kursor dapat mendeteksi perubahan pada tataan hasil asli.