• Tidak ada hasil yang ditemukan

Membuat Dan Menggunakan Cursor

Dalam dokumen Kebutuhan Sistem & Pengenalan Software (Halaman 125-131)

Store Program MySQL

3.12 Pernyataan SQL Dalam Program Store

3.12.3 Membuat Dan Menggunakan Cursor

Cursor adalah object untuk menangani pernyataan SELECT yang mengembalikan baris data lebih dari satu secara terprogram. Cursor melakukan penelusuran secara berkelanjutan mulai dari awal sampai akhir terhadap rangkaian hasil baris data dan mengambil tindakan tertentu pada setiap baris data yang ditemui.

Parameter kode_buku Variable program stored

Pelimpahan kolom table ke variable program stored

Dodit Suprianto: “Pemrograman Database Dengan MySQL Dan Visual Basic .NET/2005/2008”. 124

3.12.3.1 Deklarasi Cursor

Pendeklarasian cursor dilakukan melalui pernyataan DECLARE seperti penulisan berikut ini:

DECLARE nama_cursor CURSOR FOR pernyataan_SELECT;

Deklarasi cursor harus diletakkan setelah semua pendeklarasian variable.

Mendeklarasikan cursor sebelum pendeklarasian variable akan menyebabkan kesalahan dengan pesan error 1337.

mysql> DROP PROCEDURE IF EXISTS CURSOR_BURUK;

CREATE PROCEDURE CURSOR_BURUK() BEGIN

DECLARE c CURSOR FOR SELECT * from buku_tb;

DECLARE i INT;

END;

Query OK, 0 rows affected

1337 - Variable or condition declaration after cursor or handler declaration

Cursor selalu dihubungkan dengan pernyataan SELECT, contoh berikut ini menunjukkan sebuah deklarasi cursor sederhana yang akan menelusuri kolom tertentu dari table buku_tb.

DECLARE cursor1 CURSOR FOR

SELECT kode_buku, judul FROM customers;

Sebuah cursor dapat dipengaruhi oleh variable parameter program stored melalui penggunaan klausa WHERE. Contoh di bawah ini adalah cursor yang mengandung parameter stored procedure, diletakkan pada klausa WHERE. Ketika cursor dibuka, parameter akan menjadi penentu baris data mana yang akan dikembalikan.

Pernyataan DECLARE seharusnya diletakkan di sini

Dodit Suprianto: “Pemrograman Database Dengan MySQL Dan Visual Basic .NET/2005/2008”. 125

DROP PROCEDURE IF EXISTS DEMO_CURSOR;

CREATE PROCEDURE DEMO_CURSOR (in_kode_buku CHAR(14)) BEGIN

DECLARE v_kode_buku CHAR(13);

DECLARE v_judul TINYTEXT;

DECLARE C1 CURSOR FOR SELECT kode_buku, judul FROM buku_tb

WHERE kode_buku = in_kode_buku;

3.12.3.2 Pernyataan-pernyataan Cursor

Bahasa program store MySQL mendukung tiga pernyataaan yang berhubungan dengan operasi cursor:

OPEN

Untuk membuka cursor sebelum mengambil baris data apapun dari cursor tersebut.

OPEN nama_cursor;

FETCH

Penelusuran baris data berikutnya dari cursor dan memindahkan penunjuk cursor (pointer) di dalam result set (hasil berupa sekumpulan baris data).

FETCH nama_cursor INTO daftar_variable;

daftar_variable adalah variable yang memiliki kesamaan tipe dengan tipe kolom yang diperoleh dari pernyataan SELECT deklarasi cursor dan menjadi tempat tampungan nilai data kolom (result set).

CLOSE

Untuk mematikan dan membebaskan memori yang telah dipakai oleh cursor.

CLOSE cursor_name;

Parameter store procedure

Dodit Suprianto: “Pemrograman Database Dengan MySQL Dan Visual Basic .NET/2005/2008”. 126

3.12.3.3 Mengambil Satu Baris Cursor

Secara mendasar proses pengambilan satu baris cursor adalah: membuka cursor, mengambil satu baris data, dan menutup result set. Secara logika serupa dengan pernyataan SELECT disertai klausa INTO.

DROP PROCEDURE IF EXISTS DEMO_CURSOR;

CREATE PROCEDURE DEMO_CURSOR() BEGIN

DECLARE v_kode_buku CHAR(13);

DECLARE v_judul TINYTEXT;

DECLARE cursor1 CURSOR FOR SELECT kode_buku, judul FROM buku_tb;

OPEN cursor1;

FETCH cursor1 INTO v_kode_buku, v_judul;

CLOSE cursor1;

END;

3.12.3.4 Mengambil Keseluruhan Result Set

Pemrosesan cursor yang paling sering digunakan adalah mengambil setiap baris yang diperoleh dari pernyataan SELECT cursor, melakukan satu atau lebih operasi terhadap data yang telah ditelusuri, kemudian menutup cursor setelah mencapai baris terakhir. Contoh berikut ini menunjukkan bagaimana mendeklarasikan dan membuka cursor, mengambil baris-baris data dari cursor dengan cara perulangan dan menutup cursor.

DROP PROCEDURE IF EXISTS DEMO_CURSOR;

CREATE PROCEDURE DEMO_CURSOR() BEGIN

DECLARE v_kode_buku CHAR(13);

DECLARE v_judul TINYTEXT;

DECLARE cursor1 CURSOR FOR SELECT kode_buku, judul FROM buku_tb;

OPEN cursor1;

label_cursor: LOOP

FETCH cursor1 INTO v_kode_buku, v_judul;

END LOOP label_cursor;

CLOSE cursor1;

Dodit Suprianto: “Pemrograman Database Dengan MySQL Dan Visual Basic .NET/2005/2008”. 127

END;

Kode program di atas kelihatannya benar dan lengkap tetapi sebenarnya masih ada masalah. Jika penelusuran telah mencapai pada baris terakhir pengambilan, maka MySQL akan menampilkan pesan kesalahan "no data to fetch" (MySQL error 1329; SQLSTATE 02000) seperti berikut ini:

mysql> CALL DEMO_CURSOR();

1329 - No data - zero rows fetched, selected, or processed

Cara mengatasinya adalah melalui pendeklarasian error handler (penanganan kesalahan). Error handler akan menangkap kesalahan "no data to fetch" sehingga perulangan yang sedang terjadi dapat dihentikan dan cursor ditutup. Penambahan kode program error handler menjadi seperti berikut ini:

DECLARE CONTINUE HANDLER FOR NOT FOUND SET baris_akhir=1;

Penanganan kesalahan MySQL melakukan dua hal saat terjadi "no data to fetch":

1. Memberi nilai pada variable baris_akhir dengan 1 jika pointer (penunjuk cursor) sudah mencapai baris akhir result set yang diperoleh dari perintah SELECT cursor.

2. Mengizinkan program untuk melanjutkan eksekusi jika belum mencapai baris akhir result set.

Program sekarang dapat mengecek nilai dari variable baris_akhir. Jika bernilai 1 berarti baris terakhir telah diambil dan perulangan harus dihentikan dan cursor ditutup. Kita harus melakukan penataan ulang (reset) terhadap penunjuk baris akhir result set setelah cursor ditutup dengan cara memberi nilai 0 pada variable baris_akhir. Contoh berikut ini menunjukkan langka-langkahnya, yaitu mendeklarasikan handler CONTINUE, melakukan perulangan baris result set, meninggalkan

Dodit Suprianto: “Pemrograman Database Dengan MySQL Dan Visual Basic .NET/2005/2008”. 128

perulangan jika variable baris_akhir telah diberi nilai, kemudian membersihkannya.

DROP PROCEDURE IF EXISTS DEMO_CURSOR;

CREATE PROCEDURE DEMO_CURSOR() BEGIN

DECLARE v_kode_buku CHAR(13);

DECLARE v_judul TINYTEXT;

DECLARE baris_akhir TINYTEXT;

DECLARE cursor1 CURSOR FOR SELECT kode_buku, judul FROM buku_tb;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET baris_akhir=1;

SET baris_akhir=0;

OPEN cursor1;

label_cursor: LOOP

FETCH cursor1 INTO v_kode_buku, v_judul;

IF baris_akhir=1 THEN LEAVE label_cursor;

END IF;

/* Lakukan sesuatu disini */

END LOOP label_cursor;

CLOSE cursor1;

SET baris_akhir=0;

END;

3.12.3.5 Jenis Perulangan Cursor

Masih ada dua jenis perulangan selain LOOP END LOOP yaitu perulangan WHILE dan REPEAT UNTIL. Berikut ini contoh cursor dengan perulangan WHILE:

DROP PROCEDURE IF EXISTS DEMO_CURSOR_WHILE;

CREATE PROCEDURE DEMO_CURSOR_WHILE() BEGIN

DECLARE v_kode_buku CHAR(13);

DECLARE v_judul TINYTEXT;

DECLARE baris_akhir TINYTEXT;

DECLARE cursor1 CURSOR FOR SELECT kode_buku, judul FROM buku_tb;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET baris_akhir=1;

SET baris_akhir=0;

OPEN cursor1;

Dodit Suprianto: “Pemrograman Database Dengan MySQL Dan Visual Basic .NET/2005/2008”. 129

label_cursor: WHILE (baris_akhir=0) DO FETCH cursor1 INTO v_kode_buku, v_judul;

/* Lakukan sesuatu disini*/

IF baris_akhir=1 THEN LEAVE label_cursor;

END IF;

END WHILE label_cursor;

CLOSE cursor1;

SET baris_akhir=0;

END;

Contoh cursor dengan perulangan REPEAT UNTIL:

DROP PROCEDURE IF EXISTS DEMO_CURSOR_REPEAT;

CREATE PROCEDURE DEMO_CURSOR_REPEAT() BEGIN

DECLARE v_kode_buku CHAR(13);

DECLARE v_judul TINYTEXT;

DECLARE baris_akhir TINYTEXT;

DECLARE cursor1 CURSOR FOR SELECT kode_buku, judul FROM buku_tb;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET baris_akhir=1;

SET baris_akhir=0;

OPEN cursor1;

label_cursor: REPEAT

FETCH cursor1 INTO v_kode_buku, v_judul;

/* Lakukan sesuatu disini*/

IF baris_akhir THEN LEAVE label_cursor;

END IF;

UNTIL baris_akhir END REPEAT label_cursor;

CLOSE cursor1;

SET baris_akhir=0;

END;

Dalam dokumen Kebutuhan Sistem & Pengenalan Software (Halaman 125-131)

Dokumen terkait