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

  1. Untuk menerima hasil query yang jumlah barisnya lebih dari 1 baris
  2. 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
  • 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;
  • 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;

Ref Cursor Kita dapat menggunakan ref cursor untuk mengembalikan nilai dalam bentuk recordset/cursor di store procedure. Ada 2 tipe ref cursor :

  1. Strong ref cursor : tipe data dan panjangnya harus diketahui saat compile
  2. 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; More >