Oracle Cursor dan Ref Cursor
January 6th, 2009
Definisi Cursor
Dalam blok PL/SQL tidak mengijinkan kita membuat query yang menghasilkan lebih dari satu baris untuk ditampung dalam sebuah variabel. Variabel semacam ini dinamakan cursor.
Kegunaan
- Untuk menerima hasil query yang jumlah barisnya lebih dari 1 baris
- Memungkinkan untuk melakukan proses yang lebih kompleks untuk setiap record
Macam2 Cursor
Cursor : cursor eksplisit dan cursor implisit
- Cursor Eksplisit : Cursor yang harus dideklarasikan terlebih dahulu sebelum digunakan
- Cursor Implisit : Cursor yang tidak perlu dideklarasikan dulu pada declare section. contoh cursor implisit diasosiasikan dengan perintah SELECT, INSERT, DELETE, dan UPDATE
Contoh :DECLARE id VARCHAR2(10); vnama_petugas PETUGAS.nama_petugas%TYPE; BEGIN id := 'PG-010'; //assigment value SELECT nama_petugas INTO vnama_petugas FROM PETUGAS WHERE id_petugas = id; IF SQL%NOTFOUND THEN DBMS_OUTPUT.PUT_LINE('Data ditemukan'); ELSE DBMS_OUTPUT.PUT_LINE ('Nama petugas dengan id : ' || id || 'adalah ' || vnama_petugas); END IF; END;
Contoh :
DECLARE CURSOR c_nama IS SELECT nama_petugas FROM pegawai ORDER BY nama_petugas ASC; v_nama PETUGAS.nama_petugas%TYPE; /**%TYPE agar tipe data variabel v_nama sama dengan kolom nama_petugas?*/ BEGIN FOR X IN c_nama LOOP DBMS_OUTPUT.PUT_LINE (c_nama%ROWCOUNT ||'Daftar Nama Petugas : ' || x.nama_petugas); END LOOP; END;
Ref Cursor
Kita dapat menggunakan ref cursor untuk mengembalikan nilai dalam bentuk recordset/cursor di store procedure.
Ada 2 tipe ref cursor :
- Strong ref cursor : tipe data dan panjangnya harus diketahui saat compile
- Weak ref cursor : tipe data dan panjangnya tidak dibutuhkan saat compile
Contoh :
declare type r_cursor IS REF CURSOR; c_emp r_cursor; en emp%rowtype; begin open c_emp FOR SELECT * FROM emp; loop fetch c_emp INTO en; exit when c_emp%notfound; dbms_output.put_line(c_emp%rowcount ||'. '||en.nama); end loop; close c_emp; end; declare type r_cursor IS REF CURSOR; c_emp r_cursor; en emp%rowtype; begin open c_emp FOR SELECT * FROM emp; loop fetch c_emp INTO en; exit when c_emp%notfound; dbms_output.put_line(c_emp%rowcount ||'. '||en.nama); end loop; close c_emp; end;
Menggunakan ref cursor di dalam loop
Contoh :
declare type r_cursor IS REF CURSOR; c_emp r_cursor; type rec_emp IS record ( deptno varchar2(20), nama number(6) ); er rec_emp; begin FOR i IN (SELECT deptno,lokasi FROM location) loop open c_emp FOR SELECT * FROM emp WHERE deptno = i.deptno; dbms_output.put_line(i.lokasi); dbms_output.put_line('--------------'); loop fetch c_emp INTO er; exit when c_emp%notfound; dbms_output.put_line(er.name || ' - ' || er.sal); end loop; close c_emp; end loop; end;
pada variabel ‘i’ tersedia informasi pada tabel location (deptno, lokasi).
Persamaan dan perbedaan antara cursor dan ref cursor :
Persamaan :
- Untuk menerima hasil query yang jumlah barisnya lebih dari 1 baris
- Memungkinkan untuk melakukan proses yang lebih kompleks untuk setiap record
Perbedaan :
- Sebuah ref cursor dapat diasosiasikan dengan lebih dari 1 klausa SELECT saat run-time. Sebelum klausa SELECT baru, cursor sebelumnya harus ditutup dulu.




