Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Database SQL di Microsoft Fabric
Operasi dalam database relasional bertindak pada sekumpulan baris lengkap. Misalnya, kumpulan baris yang dikembalikan oleh pernyataan SELECT terdiri atas semua baris yang memenuhi kondisi dalam klausa WHERE pada pernyataan tersebut. Seluruh kumpulan baris yang dikembalikan oleh pernyataan ini dikenal sebagai himpunan hasil. Aplikasi, terutama aplikasi online interaktif, tidak selalu dapat bekerja secara efektif dengan seluruh hasil yang ditetapkan sebagai unit. Aplikasi ini membutuhkan mekanisme untuk bekerja dengan satu baris atau blok kecil baris pada satu waktu. Kursor adalah ekstensi untuk kumpulan hasil yang menyediakan mekanisme tersebut.
Kursor memperpanjang pemrosesan hasil dengan:
Mengizinkan penempatan pada baris tertentu dari tataan hasil.
Mengambil satu baris atau sekumpulan baris dari posisi saat ini dalam kumpulan hasil.
Mendukung modifikasi data pada baris yang berada pada posisi saat ini dalam kumpulan hasil.
Mendukung berbagai tingkat visibilitas terhadap perubahan yang dibuat oleh pengguna lain ke data database yang disajikan dalam tataan hasil.
Menyediakan pernyataan Transact-SQL dalam skrip, prosedur tersimpan, dan memicu akses ke data dalam kumpulan hasil.
Keterangan
Dalam beberapa skenario, jika ada kunci utama pada sebuah tabel, loop WHILE dapat digunakan sebagai pengganti kursor, tanpa menanggung overhead seperti pada penggunaan kursor.
Namun, ada situasi di mana kursor bukan hanya tidak dapat dihindari, tetapi juga benar-benar diperlukan. Dalam kasus tersebut, jika tidak ada keharusan untuk memperbarui tabel melalui kursor, gunakan kursor firehose, yaitu kursor maju cepat dan hanya-baca.
Penerapan kursor
SQL Server mendukung tiga implementasi kursor.
| Implementasi kursor | Deskripsi |
|---|---|
| Kursor Transact-SQL | Kursor Transact-SQL didasarkan pada DECLARE CURSOR sintaks dan digunakan terutama dalam skrip Transact-SQL, prosedur tersimpan, dan pemicu. Kursor Transact-SQL diimplementasikan di server dan dikelola oleh pernyataan Transact-SQL yang dikirim dari klien ke server. Mereka mungkin juga terkandung dalam batch, prosedur tersimpan, atau pemicu. |
| Kursor server antarmuka pemrograman aplikasi (API) | Kursor API mendukung fungsi kursor API di OLE DB dan ODBC. Kursor server API diimplementasikan di server. Setiap kali aplikasi klien memanggil fungsi kursor API, penyedia SQL Server Native Client OLE DB atau driver ODBC mengirimkan permintaan ke server untuk tindakan terhadap kursor server API. |
| Kursor klien | Kursor klien diimplementasikan secara internal oleh driver ODBC SQL Server Native Client dan oleh DLL yang mengimplementasikan API ADO. Kursor klien diimplementasikan dengan menyimpan semua baris kumpulan hasil dalam cache di sisi klien. Setiap kali aplikasi klien memanggil fungsi kursor API, driver ODBC SQL Server Native Client atau DLL ADO melakukan operasi kursor pada baris kumpulan hasil yang di-cache pada klien. |
Jenis kursor
SQL Server mendukung empat jenis kursor.
Kursor dapat menggunakan tempdb meja kerja. Sama seperti operasi agregasi atau pengurutan yang melimpahkan data ke disk, hal ini menimbulkan biaya I/O dan berpotensi menjadi hambatan kinerja.
STATIC kursor menggunakan tabel kerja sejak awal. Untuk informasi selengkapnya, lihat bagian worktables di panduan arsitektur pemrosesan kueri.
Teruskan saja
Kursor maju saja ditentukan sebagai FORWARD_ONLY dan READ_ONLY dan tidak mendukung pengguliran. Ini juga disebut kursor firehose dan hanya mendukung pengambilan baris secara berurutan dari awal hingga akhir kursor. Baris tidak diambil dari database sampai diminta. Efek dari semua pernyataan INSERT, UPDATE, dan DELETE yang dibuat pengguna saat ini atau dikomitkan oleh pengguna lain, yang memengaruhi baris dalam kumpulan hasil, akan terlihat ketika baris diambil dari kursor.
Karena kursor tidak dapat digulir mundur, sebagian besar perubahan yang dilakukan pada baris dalam database setelah baris diambil tidak terlihat melalui kursor. Dalam kasus di mana nilai yang digunakan untuk menentukan lokasi baris dalam tataan hasil dimodifikasi, seperti memperbarui kolom yang dicakup oleh indeks berkluster, nilai yang dimodifikasi terlihat melalui kursor.
Meskipun model kursor API database menganggap kursor forward-only sebagai jenis kursor yang berbeda, SQL Server tidak. SQL Server mempertimbangkan hanya maju dan menggulir sebagai opsi yang dapat diterapkan ke kursor statis, berbasis set kunci, dan dinamis. Kursor Transact-SQL mendukung kursor hanya maju, statis, berbasis keyset, dan dinamis. Model kursor API database mengasumsikan bahwa kursor statis, berbasis keyset, dan dinamis selalu dapat digulir. Saat atribut atau properti kursor API database diatur ke forward-only, SQL Server menerapkannya sebagai kursor dinamis forward-only.
Statis
Seluruh rangkaian hasil dari kursor statis dibuat di tempdb saat kursor dibuka. Kursor statis selalu menampilkan tataan hasil seperti saat kursor dibuka. Kursor statis mendeteksi beberapa atau tidak ada perubahan, tetapi mengonsumsi sumber daya yang relatif sedikit saat menggulir.
Kursor tidak mencerminkan perubahan apa pun yang dibuat dalam database yang memengaruhi keanggotaan tataan hasil atau perubahan pada nilai dalam kolom baris yang membentuk tataan hasil. Kursor statis tidak menampilkan baris baru yang disisipkan dalam database setelah kursor dibuka, bahkan jika cocok dengan kondisi pencarian pernyataan kursor SELECT . Jika baris yang membentuk kumpulan hasil diperbarui oleh pengguna lain, nilai data baru tidak ditampilkan di kursor statis. Kursor statis menampilkan baris yang dihapus dari database setelah kursor dibuka. Operasi UPDATE, INSERT, atau DELETE tidak tercermin dalam kursor statis (kecuali kursor ditutup dan dibuka kembali), bahkan modifikasi yang dilakukan menggunakan koneksi yang sama yang digunakan untuk membuka kursor pun tidak.
Catatan
Kursor statis SQL Server selalu hanya-baca.
Karena kumpulan hasil kursor statis disimpan dalam worktable di tempdb, ukuran baris dalam tataan hasil tidak boleh melebihi ukuran baris maksimum untuk tabel SQL Server.
Untuk informasi selengkapnya, lihat bagian worktables di panduan arsitektur pemrosesan kueri. Untuk informasi selengkapnya tentang ukuran baris maks, lihat Spesifikasi kapasitas maksimum untuk SQL Server.
Transact-SQL menggunakan istilah tidak sensitif untuk kursor statis. Beberapa API database mengidentifikasinya sebagai kursor snapshot.
Set kunci
Baris yang termasuk dan urutan baris dalam kursor berbasis keyset ditetapkan saat kursor dibuka. Kursor berbasis set kunci dikontrol oleh sekumpulan pengidentifikasi unik, atau kunci, yang dikenal sebagai set kunci. Kunci dibangun dari sekumpulan kolom yang secara unik mengidentifikasi baris dalam tataan hasil. Keyset adalah kumpulan nilai kunci dari semua baris yang memenuhi syarat untuk pernyataan SELECT pada saat kursor dibuka. Kumpulan kunci untuk kursor berbasis keyset dibuat di tempdb saat kursor dibuka.
Dinamis
Kursor dinamis adalah kebalikan dari kursor statis. Kursor dinamis menampilkan semua perubahan yang terjadi pada baris-baris dalam kumpulan hasilnya saat menelusuri kursor. Nilai data, urutan, dan keanggotaan baris dalam kumpulan hasil dapat berubah pada setiap pengambilan. Semua UPDATEpernyataan , INSERT, dan DELETE yang dibuat oleh semua pengguna terlihat melalui kursor. Pembaruan akan segera terlihat jika dibuat melalui kursor menggunakan fungsi API seperti SQLSetPos atau klausa Transact-SQL WHERE CURRENT OF . Pembaruan yang dilakukan di luar kursor tidak akan terlihat sampai dikomitkan, kecuali tingkat isolasi transaksi kursor disetel ke read uncommitted. Untuk informasi selengkapnya tentang tingkat isolasi, lihat SET TRANSACTION ISOLATION LEVEL (Transact-SQL).
Catatan
Rencana kursor dinamis tidak pernah menggunakan indeks spasial.
Meminta kursor
SQL Server mendukung dua metode untuk meminta kursor:
-
Transact-SQL
Bahasa Transact-SQL mendukung sintaks untuk menggunakan kursor yang dimodelkan setelah sintaks kursor ISO.
Fungsi kursor antarmuka pemrograman aplikasi database (API)
SQL Server mendukung fungsionalitas kursor API database ini:
ADO (Objek Data Microsoft ActiveX)
OLE DB
ODBC (Konektivitas Database Terbuka)
Aplikasi tidak boleh mencampur kedua metode ini untuk meminta kursor. Aplikasi yang menggunakan API untuk menentukan perilaku kursor kemudian tidak boleh menjalankan pernyataan Transact-SQL DECLARE CURSOR untuk juga meminta kursor Transact-SQL. Aplikasi hanya boleh dijalankan DECLARE CURSOR jika mengatur semua atribut kursor API kembali ke defaultnya.
Jika kursor Transact-SQL atau API tidak diminta, SQL Server default untuk mengembalikan kumpulan hasil lengkap, yang dikenal sebagai tataan hasil default, ke aplikasi.
Proses kursor
Kursor Transact-SQL dan kursor API memiliki sintaks yang berbeda, tetapi proses umum berikut digunakan dengan semua kursor SQL Server:
Kaitkan kursor dengan kumpulan hasil pernyataan Transact-SQL, dan tentukan karakteristik kursor, seperti apakah baris dalam kursor dapat diperbarui.
Jalankan pernyataan Transact-SQL untuk mengisi kursor.
Ambil baris dalam kursor yang ingin Anda lihat. Operasi untuk mengambil satu baris atau satu blok baris dari kursor disebut fetch. Melakukan serangkaian operasi pengambilan data untuk mengambil baris ke arah maju maupun mundur disebut pengguliran.
Secara opsional, lakukan operasi modifikasi (perbarui atau hapus) pada baris pada posisi saat ini di kursor.
Tutup kursor.