Senin, 25 Oktober 2010

TUTORIAL CURSOR

Blok PL/SQL tidak mengizinkan Anda untuk menampilkan beberapa baris dengan menggunakan perintah SELECT secara langsung. Untuk mengatasi hal tersebut, maka Anda harus menggunakan cursor. Berbeda dengan variabel biasa yang hanya dapat menyimpan satu nilai, cursor adalah sejenis variabel yang digunakan untuk menampung banyak nilai berupa baris atau record. Nilai-nilai yang disimpan di dalam sebuah cursor selanjutnya dapat dimanipulasi sehingga dapat digunakan sesuai kebutuhan. Dalam pemakaiannya, sebuah cursor harus melalui empat buah tahap, yaitu tahap deklarasi (DECLARE), buka (OPEN), ambil data (FETCH) dan tutup (CLOSE). Cursor sendiri dibedakan ke dalam dua jenis, yaitu cursor eksplisit dan implisit.


Cursor EksplisitCursor eksplisit adalah cursor yang harus dibuka dan ditutup secara manual. Dengan kata lain jenis cursor ini tidak secara otomatis terbuka sendiri. Terdapat empat buah atribut yang berhubungan erat pada saat kita menggunakan cursor, yaitu seperti yang ditunjukkan pada tabel di bawah ini.

ATRIBUT KETERANGAN
%FOUND Baris ditemukan
%NOTFOUND Baris tidak ditemukan
%ROWCOUNT Jumlah baris yang telah diambil/ditangkap melalui perintah FETCH
%ISOPEN Mengembalikan nilai TRUE apabila cursor masih dalam keadaan terbuka

Sebagai contoh apabila kita ingin melakukan pengecekan apakah suatu cursor dalam keadaan terbuka atau tidak, maka contoh kode yang perlu dituliskan adalah seperti di bawah ini.
if nama_cursor%ISOPEN then
---- kode yang ingin dituliskan
end if;

Deklarasi CursorSeperti yang telah disinggungkan sebelumnya bahwa untuk membuat sebuah cursor diperlukan adanya proses deklarasi, gunanya adalah untuk menjelaskan data-data apa saja yang akan diambil dari database dan selanjutnya disimpan ke dalam cursor. Adapun bentuk umum pendeklarasian cursor dapat Anda lihat di bawah ini.
DECLARE
CURSOR nama_cursor IS
Statemen_SELECT;
nama_cursor adalah nama yang kita berikan untuk cursor yang akan kita deklarasikan, sedangkan statemen_SELECT yang dimaksud di sini adalah query yang ingin didefinisikan.
Coba Anda perhatikan contoh pendeklarasian cursor di bawah ini.
DECLARE CURSOR cur_barang IS
SELECT kode_barang, nama_barang, stok_barang
FROM BARANG;
Pada kode di atas kita mendeklarasikan cursor dengan nama cur_barang yang akan digunakan untuk menampung semua data kode barang, nama barang dan jumlah stok yang ada pada tabel barang.

Membuka CursorSetelah Anda melakukan deklarasi cursor, kita masih belum dapat memanipulasi data yang terdapat di dalam cursor tersebut, karena cursor masih dalam keadaan tertutup. Maka dari itu, langkah selanjutnya yang perlu dilakukan adalah membuka cursor. Hal ini dilakukan karena untuk memanipulasi sebuah cursor, cursor harus sudah dalam keadaan terbuka. Adapun perintah untuk membuka cursor adalah dengan kata kunci OPEN yang diikuti dengan nama cursor yang telah dideklarasikan sebelumnya.
OPEN nama_cursor;
Sebagai contoh, apabila kita ingin membuka cursor cur_barang yang telah kita deklarasikan di atas, maka perintahnya adalah sebagai berikut.
open cur_barang;
Sampai di sini cursor cur_barang sudah dalam keadaan terbuka dan siap untuk diambil datanya melalui perintah FETCH, seperti yang akan dijelaskan sub bab berikutnya.

Mengambil / Menangkap Isi CursorOleh karena cursor menampung banyak baris, maka diperlukan suatu cara untuk menangkap nilai setiap baris dari sebuah cursor. Adapun cara untuk melakukan hal itu adalah dengan menggunakan perintah FETCH. Penting untuk diperhatikan juga bahwa untuk melakukan penangkapan sebuah baris diperlukan variabel dengan tipe nama_cursor%ROWTYPE, yang berfungsi untuk menyimpan nilai-nilai dari baris yang ditangkap tersebut. Sedangkan untuk menangkap semua baris yang terdapat dalam cursor, maka harus digunakan pengulangan. Berikut ini bentuk umum cara pengambilan sebuah baris data dari suatu cursor dan menyimpannya ke dalam sebuah variabel.
FETCH nama_cursor INTO nama_variabel;
nama_cursor adalah nama dari cursor yang akan diambil datanya, sedangkan nama_variabel adalah variabel penampung yang telah dideklarasikan dengan menggunakan tipe nama_cursor%ROWTYPE. Sebagai contoh, apabila kita ingin melakukan pengambilan semua data yang tersimpan dalam cursor cur_barang di atas, maka kita dapat melakukannya dengan menuliskan kode sebagai berikut.
declare

a cur_barang%ROWTYPE;
begin

loop
fetch cur_barang into vRec;
exit when cur_barang%NOTFOUND;
dbms_output.put_line(vRec.kode_barang || ‘ ‘ ||
vRec.nama_barang || ‘ ‘ ||
vRec.stok_barang );
end loop;

end;
pada kode tadi kita menggunakan variabel vRec yang dideklarasikan untuk mempresentasikan satu baris data dari cur_barang. Setelah cursor dibuka, kita dapat langsung mengambil datanya untuk kemudian ditampung ke dalam variabel vRec, yaitu dengan menggunakan perintah FETCH.
Sehingga satu baris data di dalam cursor dapat kita ambil dengan menggunakan statemen di bawah ini.
Fetch cur_barang into vRec;
Sedangkan untuk mengambil nilai dari variabel vRec, Anda dapat melakukannya dengan mengaksesnya langsung dengan menggunakan nama kolomnya. Hal ini sama seperti pada saat kita menggunakan tipe record. Berikut ini kode yang akan melakukan pengambilan nilai kolom dari variabel vRec.
vRec.kode_barang; -- akan mengambil nilai dari kolom, kode_barang
vRec.nama_barang; -- akan mengambil nilai dari kolom, nama_barang
vRec.jumlah_stok; -- akan mengambil nilai dari kolom, jumlah_stok
Sebagai tambahan, apabila Anda menggunakan variabel biasa (tidak menggunakan atribut %ROWTYPE), maka Anda perlu memasukkannya ke setiap variabel yang digunakan. Misalnya, di sini kita akan menggunakan tiga buah variabel yang masing-masing akan menampung kolom kode_barang, nama_barang dan stok_barang. Perhatikan contoh kode berikut.
declare

kode char(6);
nama varchar2(30);
jumlah number(4);
begin

fetch cur_barang into kode, nama, jumlah;

end;
pada kode tadi berarti nilai setiap baris yang diambil dari cursor akan dimasukkan ke dalam variabel kode, nama dan jumlah, yang didasarkan pada urutan field di dalam cursor.
Untuk lebih dapat memastikan bahwa tipe dari variabel kode, nama dan jumlah benar-benar dengan tipe dari kolom kode_barang, nama_barang dan stok_barang yang terdapat pada table barang di dalam database, maka kita dapat menggunakan atribut %TYPE yang memiliki bentuk umum seperti berikut.
Nama_variabel nama_tabel.nama_field%TYPE;
Dengan demikian kita dapat mengubah kode di atas dengan kode di bawah ini.
declare

kode_barang.kode_barang%TYPE;
nama_barang.nama_barang%TYPE;
jumlah_barang.stok_barang%TYPE;
begin

fetch cur_barang into kode, nama, jumlah;

end;
Selanjutnya, oleh karena data di dalam cursor dapat berisi lebih dari satu baris, maka untuk mengambil semua baris datanya kita perlu melakukan pengulangan. Dengan pengulangan tersebut berarti kita akan mengambil atau menangkap data mulai dari baris pertama sampai baris terakhir. Kondisi yang akan menghentikan pengulangan di atas adalah pada saat atribut cur_barang%NOTFOUND bernilai true, yang berarti bahwa baris data di dalam cursor sudah tidak ditemukan lagi.

Menutup CursorSetelah memanipulasi cursor, biasakan untuk menutup cursor tersebut. Hal ini penting jika terdapat blok PL/SQL lain yang akan membuka cursor ini lagi.
CLOSE nama_cursor;
Jika sebuah cursor tidak ditutup, maka cursor itu akan tetap dalam keadaan terbuka sampai dilakukan disconnect pada database.
Dalam kasus ini, sebaiknya kita menutup cursor cur_barang setelah proses pengambilan data selesai, yaitu dengan menuliskan perintah berikut.

Cursor ImplisitCursor implisit merupakan cursor yang tidak perlu untuk dideklarasikan sebelumnya, cursor jenis ini akan berasosiasi dengan perintah SELECT, INSERT, DELETE dan UPDATE. Adapun atribut-atribut yang terdapat pada cursor implisit adalah sbb :
• SQL%NOTFOUND
Atribut ini akan berasosiasi dengan statemen SELECT yaitu dengan mengembalikan nilai true apabila query yang didefinisikan tidak memberikan hasil (NULL) dan false apabila query memberikan hasil atau terdapat data yang ditemukan dalam proses query tersebut.
• SQL&FOUND
Atribut ini merupakan kebalikan dari atribut SQL%NOTFOUND, yaitu dengan mengembalikan nilai true apabila query memberikan hasil dan false apabila hasil query NULL.
• SQL%ISOPEN
Atribut ini akan bernilai true pada saat eksekusi query. Setelah proses eksekusi selesai maka atribut ini secara otomatis akan bernilai false.
• SQL%ROWCOUNT
Atribut ini menunjukkan banyaknya baris yang diberikan oleh query yang dilakukan oleh user.
Contoh kode cursor implisit :
declare
vNama customer.nama_customer%type;
begin
select nama_customer into vNama from customer;
where upper(kode_customer) = ‘J-0001’;
--- memeriksa query apakah memberikan hasil atau tidak
If SQL%NOTFOUND then
dbms_output.put_line(‘Data tidak ditemukan’);
else
dbms_output.put_line(‘Nama Customer : ’|| vNama);
end;
end;
/
Pada contoh diatas kita telah membuat sebuah blok PL/SQL yang berguna untuk mencari nama customer dengan kode customer ‘J-0001’. Tampak di atas bahwa kita dapat menggunakan atribut SQL%NOTFOUND untuk melakukan pengecekan terhadap hasil yang diberikan. Artinya, apabila tidak ada hasil yang diberikan dari query yang didefinisikan, maka blok PL/SQL tersebut akan menampilkan informasi yang menyebuutkan bahwa data yang dicari tidak ditemukan di dalam database. Sebaliknya, apabila ditemukan maka nama customer tersebut akan ditampilkan ke layar SQL*Plus. Sekarang coba Anda ganti kode ‘J-0001’ dengan teks sembarang, misalnya ‘XXXXX’, maka Anda akan melihat hasil seperti berikut.
1.2.1 Manipulasi Cursor dengan Struktur Pengulangan FOR
Dalam pemanipulasian data yang terdapat di dalam cursor, kita juga dapat menggunakan struktur pengulangan for. Keuntungan dari bentuk ini adalah kita tidak perlu untuk menampung data-data tersebut ke dalam variabel. Selain itu, variabel untuk pengulangan pun tidak perlu dideklarasikan. Di sini, kita tidak perlu untuk membuka maupun menutup cursor teersebut karena prosesnya sudah dilakukan secara otomatis. Maka dari itu, cursor semacam ini juga sering dinamakan cursor otomatis. Berikut ini bentuk umum yang digunakan untuk melakukan pemanipulasian data di dalam cursor dengan menggunakan struktur pengulangan for.
FOR nama_variabel IN nama_cursor LOOP
--- proses yang kan dilakukan
END LOOP;
Untuk membuktikannya, di sini kita akan membuat sebuah cursor yang dapat menyimpan semua data pada tabel barang dan menampilkannya dengan menggunakan struktur pengulangan for. Berikut ini kodenya :
declare
cursor c_customer is
select kode_customer, nama_customer from customer;
where upper(kota_customer) = ‘BANDUNG’
order by kode_customer;
begin
for j in c_customer loop
dbms_output.put_line(j.kode_customer||’ ’||
j.nama_customer);
end loop;
end;
/
Anda dapat melihat pada kode di atas bahwa kita tidak pernah mendeklarasikan variabel j, namun kita dapat menggunakannya langsung pada saat melakukan pengulangan dan pada saat melakukan pengaksesan data dari c_customer. Banyaknya pengulangan yang terjadi adalah sama dengan banyaknya baris data yang terdapat dalam cursor c_customer. Dalam kasus ini, cursor c_customer di atas digunakan untuk menampilkan kode dan nama customer yang berdomisili di kota Bandung, dan ternyata data yang dihasilkan adalah sebanyak 4 baris. Hal ini berarti pada akhir pengulangan maka variabel j juga akan bernilai 4.

Tidak ada komentar:

Posting Komentar

Visit the Site
MARVEL and SPIDER-MAN: TM & 2007 Marvel Characters, Inc. Motion Picture © 2007 Columbia Pictures Industries, Inc. All Rights Reserved. 2007 Sony Pictures Digital Inc. All rights reserved. blogger templates.
Distributed by Deluxe Templates