Seringkali seorang programmer dihadapkan pada suatu kasus yang mengharuskan untuk memproses data dari tabel, di mana data tersebut tidak bisa hanya dengan menggunakan perintah select, akan tetapi harus diproses dengan menggunakan perulangan/looping. Sementara untuk membuat suatu program kecil, hal itu dianggap kurang praktis. Dalam Ms SQL Server (khususnya Ms SQL Server 2000), tersedia suatu fitur yang bisa digunakan, yakni Fetch dan Cursor.
Cursor dapat diartikan sebagai suatu variabel yang digunakan untuk menampung hasil query satu baris/record atau lebih, di mana ia juga menjadi penampung sekaligus pointer atas hasil eksekusi query.
Di sini, kita akan coba menguraikan penggunaan sederhana dari Fetch dan Cursor, sehingga bisa dikembangkan sendiri sesuai dengan kebutuhan.
Langkah pertama, kita buat satu tabel, dalam kasus ini kita gunakan tabel dengan nama Barang, dengan 3 field (Kode, NamaBarang dan Jumlah)
CREATE TABLE [Barang] (
[Kode] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[NamaBarang] [varchar] (150) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Jumlah] [int] NULL ,
CONSTRAINT [PK_Barang] PRIMARY KEY CLUSTERED
(
[Kode]
) ON [PRIMARY]
) ON [PRIMARY]
GO
Masukkan beberapa data ke dalam tabel yang baru dibuat
Insert Into Barang (Kode, NamaBarang, Jumlah) Values ('1', 'Buku Tulis', '100')
Insert Into Barang (Kode, NamaBarang, Jumlah) Values ('2', 'Pena', '150')
Insert Into Barang (Kode, NamaBarang, Jumlah) Values ('3', 'Penggaris', '50')
Selanjutnya kita buat Transact-SQL dengan menggunakan Fetch dan Cursor. Berikut tahapan-tahapan nya
1. Declare
Mendeklarasi nama cursor yang dilanjutkan dengan struktur query select
DECLARE [nama cursor] CURSOR FOR [Query]
Contoh:
DECLARE barang_cursor CURSOR FOR
SELECT Kode, NamaBarang, Jumlah FROM Barang
WHERE NamaBarang ''
ORDER BY Kode, NamaBarang
2. Open
Setelah didekalarasi, cursor harus tersebut dibuka terlebih dahulu sebelum digunakan.
OPEN [nama cursor]
Contoh:
OPEN barang_cursor
3. Fetch
Fetch merupakan perintah untuk mengambil isi cursor yakni hasil query pada saat cursor tersebut dideklarasikan dan berikutnya ditampung ke dalam variabel.
FETCH [nama cursor] INTO [variabel1, variabel2,..]
Contoh:
FETCH NEXT FROM barang_cursor
INTO @Kode, @NamaBarang, @Jumlah
Apabila hasil query lebih dari 1 baris, maka dapat ditambahkan perulangan dengan melihat kondisi @@FETCH_STATUS
4. Close dan Deallocate
CLOSE merupakan perintah untuk menutup Cursor, kemudian Deallocate digunakan untuk melepaskan.
CLOSE [nama cursor]
DEALLOCATE [nama cursor]
Contoh:
CLOSE barang_cursor
DEALLOCATE barang_cursor
Berikut Query Keseluruhan
/* Untuk memastikan bahwa kita menggunakan database yang benar, jalankan perintah use database di mana tabel tersebut digunakan */
USE Barang
GO
/* Deklarasikan variabel-variabel yang akan dijadikan tujuan penyimpanan hasil dari FETCH. */
DECLARE @Kode varchar(50), @NamaBarang varchar(150), @Jumlah int
/* Deklarasikan Cursor yang akan digunakan, dilanjutkan dengan perintah Select dari tabel yang akan diproses. */
DECLARE barang_cursor CURSOR FOR
SELECT Kode, NamaBarang, Jumlah FROM Barang
WHERE NamaBarang ''
ORDER BY Kode, NamaBarang
/* Mengidentifikasi Cursor */
OPEN barang_cursor
/*
Menjalankan fetch pertama dan menampung isi cursor ke dalam variabel-variabel.
Pastikan posisi-posisi variabel pada saat menjalankan fetch memiliki urutan yang sama dengan field-field yang seharusnya yang ada di dalam perintah SELECT di atas
*/
FETCH NEXT FROM barang_cursor
INTO @Kode, @NamaBarang, @Jumlah
/*
Lakukan Looping data yang dihasilkan oleh Cursor
Melakukan pengecekan @@FETCH_STATUS untuk memastikan apabila masih terdapat beberapa baris data.
*/
WHILE @@FETCH_STATUS = 0
BEGIN
/* Menampilkan nilai dari variabel-variabel hasil dari Fetch. */
PRINT 'Barang : ' + @Kode + ' - ' + @NamaBarang + ' - ' + Cast(@Jumlah As Varchar(10))
/* Mengembalikan ke bagian FETCH jika baris data masih ada. Baris ini akan dieksekusi jika fetch sebelumnya berhasil dieksekusi. */
FETCH NEXT FROM barang_cursor
INTO @Kode, @NamaBarang, @Jumlah
END
/* Terakhir, jangan lupa untuk selalu menutup dan melepaskan Cursor yang sudah kita gunakan, setelah semua proses dijalankan */
CLOSE barang_cursor
DEALLOCATE barang_cursor
GO
Cursor dapat diartikan sebagai suatu variabel yang digunakan untuk menampung hasil query satu baris/record atau lebih, di mana ia juga menjadi penampung sekaligus pointer atas hasil eksekusi query.
Di sini, kita akan coba menguraikan penggunaan sederhana dari Fetch dan Cursor, sehingga bisa dikembangkan sendiri sesuai dengan kebutuhan.
Langkah pertama, kita buat satu tabel, dalam kasus ini kita gunakan tabel dengan nama Barang, dengan 3 field (Kode, NamaBarang dan Jumlah)
CREATE TABLE [Barang] (
[Kode] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[NamaBarang] [varchar] (150) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Jumlah] [int] NULL ,
CONSTRAINT [PK_Barang] PRIMARY KEY CLUSTERED
(
[Kode]
) ON [PRIMARY]
) ON [PRIMARY]
GO
Masukkan beberapa data ke dalam tabel yang baru dibuat
Insert Into Barang (Kode, NamaBarang, Jumlah) Values ('1', 'Buku Tulis', '100')
Insert Into Barang (Kode, NamaBarang, Jumlah) Values ('2', 'Pena', '150')
Insert Into Barang (Kode, NamaBarang, Jumlah) Values ('3', 'Penggaris', '50')
Selanjutnya kita buat Transact-SQL dengan menggunakan Fetch dan Cursor. Berikut tahapan-tahapan nya
1. Declare
Mendeklarasi nama cursor yang dilanjutkan dengan struktur query select
DECLARE [nama cursor] CURSOR FOR [Query]
Contoh:
DECLARE barang_cursor CURSOR FOR
SELECT Kode, NamaBarang, Jumlah FROM Barang
WHERE NamaBarang ''
ORDER BY Kode, NamaBarang
2. Open
Setelah didekalarasi, cursor harus tersebut dibuka terlebih dahulu sebelum digunakan.
OPEN [nama cursor]
Contoh:
OPEN barang_cursor
3. Fetch
Fetch merupakan perintah untuk mengambil isi cursor yakni hasil query pada saat cursor tersebut dideklarasikan dan berikutnya ditampung ke dalam variabel.
FETCH [nama cursor] INTO [variabel1, variabel2,..]
Contoh:
FETCH NEXT FROM barang_cursor
INTO @Kode, @NamaBarang, @Jumlah
Apabila hasil query lebih dari 1 baris, maka dapat ditambahkan perulangan dengan melihat kondisi @@FETCH_STATUS
4. Close dan Deallocate
CLOSE merupakan perintah untuk menutup Cursor, kemudian Deallocate digunakan untuk melepaskan.
CLOSE [nama cursor]
DEALLOCATE [nama cursor]
Contoh:
CLOSE barang_cursor
DEALLOCATE barang_cursor
Berikut Query Keseluruhan
/* Untuk memastikan bahwa kita menggunakan database yang benar, jalankan perintah use database di mana tabel tersebut digunakan */
USE Barang
GO
/* Deklarasikan variabel-variabel yang akan dijadikan tujuan penyimpanan hasil dari FETCH. */
DECLARE @Kode varchar(50), @NamaBarang varchar(150), @Jumlah int
/* Deklarasikan Cursor yang akan digunakan, dilanjutkan dengan perintah Select dari tabel yang akan diproses. */
DECLARE barang_cursor CURSOR FOR
SELECT Kode, NamaBarang, Jumlah FROM Barang
WHERE NamaBarang ''
ORDER BY Kode, NamaBarang
/* Mengidentifikasi Cursor */
OPEN barang_cursor
/*
Menjalankan fetch pertama dan menampung isi cursor ke dalam variabel-variabel.
Pastikan posisi-posisi variabel pada saat menjalankan fetch memiliki urutan yang sama dengan field-field yang seharusnya yang ada di dalam perintah SELECT di atas
*/
FETCH NEXT FROM barang_cursor
INTO @Kode, @NamaBarang, @Jumlah
/*
Lakukan Looping data yang dihasilkan oleh Cursor
Melakukan pengecekan @@FETCH_STATUS untuk memastikan apabila masih terdapat beberapa baris data.
*/
WHILE @@FETCH_STATUS = 0
BEGIN
/* Menampilkan nilai dari variabel-variabel hasil dari Fetch. */
PRINT 'Barang : ' + @Kode + ' - ' + @NamaBarang + ' - ' + Cast(@Jumlah As Varchar(10))
/* Mengembalikan ke bagian FETCH jika baris data masih ada. Baris ini akan dieksekusi jika fetch sebelumnya berhasil dieksekusi. */
FETCH NEXT FROM barang_cursor
INTO @Kode, @NamaBarang, @Jumlah
END
/* Terakhir, jangan lupa untuk selalu menutup dan melepaskan Cursor yang sudah kita gunakan, setelah semua proses dijalankan */
CLOSE barang_cursor
DEALLOCATE barang_cursor
GO
Comments
Post a Comment