PL/SQL menggunakan dua tipe cursor: implisit dan eksplisit. PL/SQL mendeklarasikan cursor secara implisit untuk seluruh perintah-perintah manipulasi data SQL, termasuk query-query yang hanya menghasilkan satu baris data. Namun, untuk query-query yang menghasilkan lebih dari satu baris data, kita harus mendeklarasikan cursor eksplisit, menggunakan cursor FOR loop, atau menggunakan klausa BULK COLLECT.
Explicit Cursors
Kumpulan baris-baris data yang dihasilkan oleh query dapat terdiri dari nol, satu, atau banyak baris data, bergantung pada berapa banyak baris-baris data yang sesuai dengan kriteria pencarian yang kita inginkan. Ketika query menghasilkan banyak baris data, kita dapat secara eksplisit mendeklarasikan cursor untuk memproses baris-baris data tersebut. Lebih luas lagi, kita dapat mendeklarasikan cursor di dalam bagian deklaratif dari suatu blok PL/SQL, subprogram, atau package.
Kita menggunakan tiga perintah untuk mengontrol cursor: OPEN, FETCH, dan CLOSE. Pertama, kita menginisialisasi cursor dengan perintah OPEN, yang mana mengidentifikasi result set. Kemudian, kita dapat mengeksekusi FETCH secara berulang-ulang sampai seluruh baris-baris data ditampilkan, atau kita dapat menggunakan klausa BULK COLLECT untuk menampilkan seluruh baris-baris data sekali saja. Ketika baris data terakhir selesai diproses, kita membebaskan cursor dengan perintah CLOSE. Kita dapat memproses beberapa query di secara paralel dengan mendeklarasikan dan membuka beberapa cursor.
Cursor merupakan suatu variabel yang digunakan untuk menampung hasil query yang terdiri atas lebih dari satu row atau record. Cursor dapat diilustrasikan sebagai penampung sekaligus pointer atas hasil eksekusi query.
Cursor dibagi menjadi dua macam, yaitu :
· Cursor Implisit
· Cursor Eksplisit
1. Cursor Implisit
Cursor Implisit merupakan cursor yang tidak memerlukan deklarasi terlebih dahulu (tidak bernama). Cursor ini harus menghasilkan satu baris record.
Cursor implisit merupakan cursor yang tidak perlu dideklarasikan sebelumnya. Cursor ini berasosiasi dengan perintah SELECT, INSERT, DELETE, dan UPDATE.
Contoh cursor Implisit :
select first_name, last_name, department_name
from employees e join departments d
on e.department_id=d.department_id
where d.department_id=50;
![](file:///C:/DOCUME%7E1/MRSIDA%7E1/LOCALS%7E1/Temp/msohtmlclip1/01/clip_image002.jpg)
2. Cursor Eksplisit
• Statement declare
àMerupakan deklarasi nama cursor dan definisi struktur query yang akan dilakukan di dalamnya.
CURSOR nama_cursor IS query
Contoh:
DECLARE
CURSOR CUR1 IS SELECT nim, nama, alamat FROM mahasiswa
• Statement open
à Sebelum suatu cursor dapat digunakan, cursor harus dibuka terlebih dahulu.
OPEN nama_cursor;
Contoh:
OPEN CUR1;
• Statement fetch
à Fetch merupakan perintah untuk mengambil isi cursor, dimana isi dari cursor tersebut adalah hasil query yang telah dideklarasikan pada statement deklarasi cursor.
FETCH nama_cursor INTO ;
Contoh:
FETCH CUR1 INTO v_nim, v_nama, v_alamat;
• Statement close
à Setelah pemrosesan query selesai, cursor harus ditutup dengan statemen CLOSE .
CLOSE nama_cursor;
Contoh:
Close CUR1;
Contoh Cursor Eksplisit :
Tampilkan first name , last name dari tabel employees dan nama department yang id department diinputkan oleh user.
jawab :
declare
rata number;
total number;
jum number;
cursor cursor1 is
select first_name, last_name, salary, department_name
from employees e join departments d
on e.department_id=d.department_id
where d.department_id=&input_kode_department;
vrec cursor1%rowtype;
begin
open cursor1;
dbms_output.put_line('=======================================================');
dbms_output.put_line('NO NAME DEPARTMENT NAME SALARY');
dbms_output.put_line('=======================================================');
total:=0;
loop
fetch cursor1 into vrec;
exit when cursor1%notfound;
dbms_output.put_line(rpad(cursor1%rowcount,5,' ')||
rpad(vrec.first_name||' '||vrec.last_name,19,' ')||
rpad(vrec.department_name,25,' ')||
lpad(vrec.salary,6,' '));
total:=total+vrec.salary;
end loop;
rata:=total/cursor1%rowcount;
jum:=cursor1%rowcount;
dbms_output.put_line('=======================================================');
dbms_output.put_line('Jumlah record : '||jum);
dbms_output.put_line('Total salary : '||total);
dbms_output.put_line('Rata - rata salary : '||rata);
close cursor1;
end;
/
Tidak ada komentar:
Posting Komentar