Wednesday, July 3, 2019

Oracle Apex 11 - Cursor di PL/SQL

Assalamu'alaikum

Selamat sore, salam database!!. Melanjutkan kembali pembahasan PLSQL. Kali ini saya ingin menjelaskan tentang cursor di PLSQL. Seperti biasa, terkait pembahasan cursor ini merupakan lanjutan dari pertemuan-pertemuan sebelumnya yang sudah membahas percabangan dan perulangan. Dimana di pembahasan tersebut disenggol sedikit tentang script yang berkaitan dengan cursor. 

Cursor PLSQL

Pada program PL/SQL, kita tidak bisa menyimpan data hasil query yang lebih dari 1 record ke dalam variabel yang kita deklarasikan di blok DECLARE. Untuk menyimpan lebih dari 1 record maka gunakanlah instruksi Cursor. Karena fungsi cursor adalah sebagai penampung data dari hasil query. 

Cursor sendiri terbagi menjadi 2 yaitu
  • Implisit Cursor, adalah cursor default yang di deklarasikan dan di kelola secara otomatis oleh PL/SQL untuk semua perintah SELECT Statement di DML. Implicit cursor akan menghasilkan 1 row/record. 
  • Eksplisit Cursor, adalah cursor yang di definisikan pada bagian DECLARE dan menggunakan mekanisme Open, Fetching dan Close Cursor. Mekanisme ini akan saya jelaskan di bawah. 

Attribute Pada Cursor

Cursor memiliki beberapa attribute yang bisa digunakan. Umumnya attribute yang sering di gunakan pada cursor antara lain :
  • SQL%ROWCOUNT, Untuk menampilkan jumlah record yang di hasilkan dari SELECT, UPDATE dan DELETE statement.
  • SQL%FOUND, Bernilai TRUE jika cursor menghasilkan record/baris atau record berhasil di update atau di delete.
  • SQL%NOTFOUND, Kebalikan dari SQL%FOUND, yaitu bernilai TRUE jika cursor tidak menghasilkan record/baris. 
  • SQL%ISOPEN, Bernilai true jika cursor masih aktif (open). 
Ke empat attribute yang di sebutkan akan kita coba di latihan cursor implisit dan eksplisit dibawah.

Implisit Cursor

Seperti pemaparan teorinya, cursor digunakan untuk menyimpan data query pada database untuk di tampung ke variabel yang kita buat. Sedangkan implisit cursor digunakan untuk menampung satu record pada suatu tabel ke dalam variabel. Ingat, implisit hanya bisa menampung satu record saja. Artinya jika ingin menampilkan lebih dari satu record, maka gunakan eksplisit cursor.


Semisal disini saya ingin menampilkan data nama pelanggan dengan kode_pelanggan=4. Maka cara menampilkan datanya dengan menggunakan program PLSQL adalah dengan membuat variabel terlebih dahulu (disini saya buat variabel Nama_Pel) dengan tipe data yang sama seperti tipe data dari data yang ditampilkan (Nama_Pelanggan menggunakan tipe data Varchar). 

Jika sudah, kita gunakan perintah SELECT terhadap nama kolom dan database serta kondisi yang diinginkan berkaitan dengan query terkait untuk di arahkan ke variabel yang sudah di buat. Berikut script PLSQL Cursor Implisitnya. 


SELECT Nama_Pelanggan INTO Nama_Pel FROM PELANGGAN WHERE Kode_Pelanggan=4;
Nantinya tinggal kita berikan instruksi output terhadap nama variabelnya. Berikut script PL/SQL lengkapnya.

DECLARE
  Nama_Pel VARCHAR (25);
BEGIN
  SELECT Nama_Pelanggan INTO Nama_Pel FROM PELANGGAN WHERE Kode_Pelanggan=4;
 
  DBMS_OUTPUT.PUT_LINE(Nama_Pel);
END;
Alfa

Kita juga bisa menampilkan data lengkap pelanggan dengan kode_pelanggan 4 tersebut dengan menggabungkannya menggunakan operator (||) yang memiliki fungsi operator AND. Dan juga jika penulisan di atas menggunakan kurung buka dan tutup untuk menangkap kolom datanya, pada dasarnya tanpa kurung juga sudah bisa untuk diarahkan ke variabel yang kita inginkan. Berikut contohnya.
 
DECLARE
  Info_Pel VARCHAR (25);
BEGIN
  SELECT Kode_Pelanggan || ' ' || Nama_Pelanggan || ' ' ||  Alamat_Pelanggan INTO Info_Pel FROM PELANGGAN WHERE
  Kode_Pelanggan=4;
 
  DBMS_OUTPUT.PUT_LINE(Info_Pel);
END;
4 Alfa Bekasi

Memanfaatkan Attibute Cursor Untuk Debug 

Seperti yang sudah saya listing diatas tentang attribute yang disebutkan. Kita bisa memanfaatkan attribute tersebut untuk melakukan debug informasi terhadap query yang kita lakukan pada database. Semisal perintah SQL%NOTFOUND dan SQL%FOUND digunakan sebagai percabangan untuk melakukan pengecekkan apakah data berhasil di update atau tidak.

Dan perintah SQL%ROWCOUNT digunakan untuk menghitung jumlah baris dari berapa record yang berhasil di input ke dalam database. Dimana perintah ini juga bisa di arahkan ke dalam variabel yang kita deklarasikan. Berikut contoh query update seluruh data salary karyawan pada tabel employees di skema HR. 
DECLARE
  Jumlah_Baris number(5);
BEGIN
  UPDATE employees SET salary = salary + 1000;
 
  IF SQL%NOTFOUND THEN
    DBMS_OUTPUT.PUT_LINE('Tidak ada record yang berhasil di update');
  ELSIF SQL%FOUND THEN
    Jumlah_Baris := SQL%ROWCOUNT;
    DBMS_OUTPUT.PUT_LINE('Ada ' || Jumlah_Baris || ' record yang telah berhasil di update');
  END IF;
END;
Ada 107 record yang telah berhasil di update

Maka hasilnya begitu script PLSQL sudah di eksekusi, semua gaji karyawan akan bertambah nominalnya sebanyak 1000.

Eksplisit Cursor

Selanjutnya adalah eksplisit cursor. Cursor ini memiliki mekanisme Open, Fetching dan Close Cursor untuk menggunakannya. Fungsinya cursor eksplisit ini adalah untuk menampilkan query lebih dari 1 record. Semisal disini saya ingin menampilkan data_pelanggan dii skema HR. Tidak ada kondisi yang perlu saya berikan, saya hanya ingin menampilkan listing data pelanggan. Kolom yang ingin saya tampilkan semisal hanya nama dan alamat. 


Untuk variabel disini yang saya deklarasikan ada 2 yaitu variabel data_pelanggan untuk menampung listing record pada data_pelanggan dan satunya variabel untuk eksplisit cursornya. Perlu di catat disini, eksplisit cursor wajib di deklarasikan variabelnya. 

Pada isi programnya saya menempatkan statement percabangan untuk melakukan pengecekkan apakah cursor sudah aktif dengan menggunakan attribute SQL%ISOPEN. Jika belum maka di aktifkan dengan menggunakan perintah mekanisme eksplisit cursor yaitu Open. 

Sedangkan mekanisme fetch yang memiliki fungsi untuk mengambil data recordnya saya letakkan di statement perulangan agar data yang di tampilkan berulang nantinya. Dimana fetch inilah yang diarahkan ke variabel listing record yang kita buat di deklarasi. Hasil tampungan fetch langsung di berikan output. Dan jika perulangan berakhir karena data tidak di temukan (SQL%NOTFOUND), maka ditutup dengan close cursor. 
DECLARE
    data_pelanggan PELANGGAN%rowtype;
    CURSOR c_pelanggan IS SELECT * FROM PELANGGAN;

BEGIN
    IF NOT c_pelanggan%ISOPEN THEN
       OPEN c_pelanggan;
    END IF;

    LOOP
        EXIT WHEN c_pelanggan%NOTFOUND;
        FETCH c_pelanggan INTO data_pelanggan;
        DBMS_OUTPUT.PUT_LINE(data_pelanggan.Nama_Pelanggan || ' ' || data_pelanggan.Alamat_Pelanggan);
    END LOOP;

    CLOSE c_pelanggan;

END;
Anton Inkopol
Budi Kranji
Charli Jakasampurna
Testing Nama Jabodetabek
Alfa Bekasi
Testing Nama Jabodetabek
Testing Nama Jabodetabek
Testing Nama Jabodetabek
Demikian penjelasan mengenai cursor. Semoga bermanfaat bagi pembaca. Sekian dari saya, jika ada yang ingin di tanyakan bisa letakkan di kolom komentar. Terima kasih sudah berkunjung, sampai berjumpa di pembahasan oracle apex selanjutnya. Salam Database!!.

0 komentar:

Post a Comment

Kenal Saya

Follow My Twitter

Profil



Nama saya Alfa Farhan Syarief, web ini ada berdasarkan nama saya sendiri. Saya sendiri masih duduk tingkat SMK. Lebih lengkapnya saya masih bersekolah di SMKN 1

More »

Blog Archive

Recent Comment