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;
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;
/