Cursor M. Saefudin SKom, MMSI
Kompetensi Dasar: 1. Memahami tujuan penggunaan cursor 3. Memahami penerapan cursor
Indikator: 1. Mampu menjelaskan manfaat dari cursor 2. Memahami dan mampu menggunakan cursor terhadap basis data
Pengantar Cursor merupakan pointer yang menunjuk ke suatu bagian memori yang dikelola oleh SQL Server untuk menyimpan hasil perintah SQL SELECT, INSERT, UPDATE dan DELETE. Pointer dalam bahasa Indonesia berarti penunjuk. Pointer menyimpan atau menunjuk suatu alamat memori .
Membuat Cursor Operasi-operasi yang dapat dilakukan terhadap sebuah variabel cursor adalah : 1. DECLARE @nama_ variabel_lokal dan SET @nama_ variabel_lokal 2. OPEN 3. FETCH 4. CLOSE 5. DEALLOCATE
Penggunaan cursor Penggunaan cursor membutuhkan deklarasi cursor. Yang perlu diperhatikan adalah tipe data cursor tidak dapat digunakan untuk tipe data dalam sebuah tabel. Deklarasi cursor ditandai dengan keyword DECLARE nama_cursor. Selanjutnya dibuat perintah SQL SELECT, INSERT, UPDATE dan DELETE yang akan menghasilkan 0, 1 atau beberapa record yang memenuhi kualifikasi. Recordrecord tersebut disimpan dalam memori dan cursor menunjuk ke bagian memori tersebut. Cursor dikendalikan melalui operasi OPEN, FETCH, CLOSE dan DEALLOCATE.
Operasi FETCH Untuk mengambil record tertentu dari yang dimiliki sebuah cursor. Sintaks: FETCH [ [ NEXT | PRIOR | FIRST | LAST | ABSOLUTE { n | @nvar } | RELATIVE { n | @nvar } ] FROM ] { { [ GLOBAL ] cursor_name } | @cursor_variable_name } [ INTO @variable_name [ 1...n ] ] Arguments
Operasi NEXT Mengambil nilai record yang ada sekarang dan menggeser penunjuk ke record berikutnya.
Operasi PRIOR Mengambil nilai record yang ada sekarang dan menggeser penunjuk ke record sebelumnya.
Operasi FIRST Mengambil nilai record pertama dari sebuah cursor
Operasi LAST Mengambil nilai record terakhir dari sebuah cursor
Operasi ABSOLUTE {n | @nvar} Mengambil record tertentu dari cursor, jika @nvar positive, maka yang akan dihasilkan adalah baris ke n. sedangkan jika @nvar negative, maka akan mengembalikan record ke n dihitung dari akhir cursor.
Operasi RELATIVE {n | @nvar} Mengambil record tertentu dari kursor, jika @nvar positive dengan pedoman posisi saat ini, maka yang akan dihasilkan adalah record ke n setelah posisi saat ini. Sedangkan jika @nvar negative, maka akan mengembalikan record ke n sebelum posisi saat ini.
Operasi GLOBAL Untuk menentukan cursor_name sebagai cursor global.
cursor_name Nama dari kursor.
@cursor_variable_name Nama dari varibel yang ditujukan ke cursor yang terbuka sehingga dapat dilakukan operasi FETCH.
INTO @variable_name[1..n] Data dari kolom tertentu diletakkan dalam variabel lokal.
Isi tabel Jabatan
Penggunaan cursor pada tabel Jabatan
Keterangan: 1. Dideklarasikan sebuah cursor bernama ‘cursor_jabatan’ yang digunakan untuk hasil perintah SELECT. 2. Cursor diaktifkan dengan operasi OPEN dan cursor akan menunjuk ke record pertama. 3. Kemudian mengecek apakah datanya masih ada. Hasil temuan cursor akan dinyatakan melalui variabel @@FETCH_STATUS. Merupakan nilai kembalian dari hasil perintah FETCH pada cursor. FETCH berikutnya akan memproses record satu per satu sampai tidak ada lagi record yang valid. 4. Selama cursor masih menunjuk ke record yang benar maka @@FETCH_STATUS=0. Jika datanya masih ada maka tampilkan data selanjutnya. 5. Cursor ditutup dengan perintah CLOSE. Cursor ini akan tetap berada di memori sampai dilakukan dealokasi dengan perintah DEALLOCATE untuk membebaskan memory yang telah dipakai cursor.
Penggunaan cursor pada tabel Jabatan
Keterangan: 1. Deklarasi cursor bernama ‘cursor_jabatan’. Cursor ini digunakan pada hasil perintah SELECT. 2. Secara default, cursor hanya dapat dialokasikan melalui operasi FETCH NEXT. Supaya dapat melakukan navigasi cursor secara lebih fleksibel maka digunakan FETCH FIRST, FETCH LAST, FETCH PRIOR, FETCH ABSOLUTE, FETCH RELATIVE dan lain-lain. Untuk keperluan ini dibutuhkan deklarasi cursor secara eksplisit berikut: DECLARE cursor_jabatan SCROLL CURSOR 3. Scrollable cursor mempunyai beberapa operasi navigasi berikut: a. FETCH FIRST, artinya cursor pada record pertama. b. FETCH NEXT, artinya record berikutnya. c. FETCH PRIOR, artinya record sebelumnya. d. FETCH LAST, artinya record yang terakhir. e. FETCH ABSOLUTE m, artinya record ke-m. f. FETCH RELATIVE m, artinya m record sesudah record dimana cursor berada. FETCH RELATIVE -m, artinya m record sebelum record dimana cursor berada.
3. Scrollable cursor mempunyai beberapa operasi navigasi berikut: a. FETCH FIRST, artinya cursor pada record pertama. b. FETCH NEXT, artinya record berikutnya. c. FETCH PRIOR, artinya record sebelumnya. d. FETCH LAST, artinya record yang terakhir. e. FETCH ABSOLUTE m, artinya record ke-m. f. FETCH RELATIVE m, artinya m record sesudah record dimana cursor berada. FETCH RELATIVE -m, artinya m record sebelum record dimana cursor berada.
4. Cursor yang telah dideklarasikan dibuka dengan perintah OPEN dan cursor akan menunjuk ke record pertama. 5. Cursor diaktifkan untuk digunakan melalui operasi FETCH. 6. FETCH mengisi variabel dengan cursor cursor_jabatan sesuai dengan hasil SELECT. 7. Cursor ditutup dengan perintah CLOSE. Cursor ini akan tetap berada di memori sampai dilakukan dealokasi dengan perintah DEALLOCATE.
Latihan Misalnya ada kasus seperti berikut ini, pada tabel Jabatan, kita lupa membuat primary key, (untuk contoh kasus seperti ini, jika tabel Jabatan masih mempunyai primary key, silahkan hapus dulu primary key tersebut, kemudian isikan data ke tabel Jabatan sehingga data-datanya seperti berikut ini) sehingga data bisa diduplikat seperti contoh berikut ini:
Perhatikan bahwa jabatan direktur berulang 3 kali sedangkan jabatan keuangan berulang 2 kali. Buatlah perintah dengan menggunakan cursor untuk menangani kasus seperti di atas. Tujuannya adalah menghilangkan duplikasi data!