5.1 Struktur Percabangan
5.1.2 Statemen CASE
Struktur CASE ini sepadan dengan struktur IF-THEN-ELSIF. Pada penggunaan statemen CASE dapat diklasifikasikan ke dalam dua bagian, yaitu simple CASE dan searched CASE.
5.1.2.1 Simple CASE
CASE (ekspresi)
WHEN nilai_1 THEN statemen_1; WHEN nilai_2 THEN statemen_2;
...
WHEN nilai_n THEN statemen_n; [ELSE statemen_lain;]
END CASE;
Struktur ini memiliki sebuah ekspresi setelah keyword CASE yang akan dibandingkan dengan tiap nilai pada blok WHEN. Kondisi WHEN yang pertama kali ditemukan bernilai TRUE akan dieksekusi dan dilanjutkan ke statemen di bawah blok pemilihan CASE.
Contoh
/*Prosedur untuk menentukan nama hari*/
CREATE OR REPLACE PROCEDURE prc_nama_hari (pi_noHari INTEGER) IS
v_namaHari VARCHAR2;
BEGIN
-- Penentuan nama hari berdasar nomor urut hari
v_namaHari := CASE pi_noHari
WHEN 1 THEN ‘Senin’ WHEN 2 THEN ‘Selasa’ WHEN 3 THEN ‘Rabu’ WHEN 4 THEN ‘Kamis’
WHEN 7 THEN ‘Minggu’ ELSE ‘Tidak terdefinisi’
END CASE; DBMS_OUTPUT.PUT_LINE(v_namaHari); END; SQL> set serveroutput on SQL> exec prc_nama_hari(3); Keterangan - v_namaHari := CASE pi_noHari
WHEN 1 THEN ‘Senin’ WHEN 2 THEN ‘Selasa’ WHEN 3 THEN ‘Rabu’ WHEN 4 THEN ‘Kamis’ WHEN 5 THEN ‘Jumat’
WHEN 6 THEN ‘Sabtu’
WHEN 7 THEN ‘Minggu’ ELSE ‘Tidak terdefinisi’
END CASE;
Nilai variabel v_namaHari tergantung dari parameter input pi_noHari :
noHari = 1 namaHari = Senin noHari = 2 namaHari = Selasa noHari = 3 namaHari = Rabu noHari = 4 namaHari = Kamis noHari = 5 namaHari = Jumat noHari = 6 namaHari = Sabtu noHari = 7 namaHari = Minggu
noHari ≠ 1,2,3,4,5,6, atau 7 namaHari = Tidak terdefinisi
5.1.2.2 Searched CASE
CASE
WHEN ekspresi_1 = nilai_1 THEN statemen_1; WHEN ekspresi_2 = nilai_2 THEN statemen_2;
...
WHEN ekspresi_n = nilai_n THEN statemen_n; [ELSE statemen_lain;]
END CASE;
Searched CASE mengevaluasi sederetan ekspresi untuk menemukan kondisi TRUE pertama. Kondisi WHEN pertama yang bernilai TRUE akan dieksekusi dan dilanjutkan ke statemen di bawah blok pemilihan CASE. Contoh
/*Prosedur untuk menaikkan gaji pegawai*/
CREATE OR REPLACE PROCEDURE prc_upd_gaji ( pi_no_peg VARCHAR2) IS
v_pct_fgaji NUMBER(5,2); v_gaji_col NUMBER;
BEGIN
-- Penentuan nilai gaji yang digunakan
-- untuk menentukan presentasi kenaikan gaji
SELECT gaji INTO v_gaji_col FROM pegawai
WHERE UPPER(no_peg) = UPPER(pi_no_peg);
-- Menetapkan persentase kenaikan gaji
CASE
WHEN v_gaji_col >= 3000000 THEN v_pct_fgaji := 5.00;
WHEN v_gaji_col >= 2000000 THEN v_pct_fgaji := 8.00;
WHEN v_gaji_col >= 1000000 THEN v_pct_fgaji := 10.00;
-- Update gaji, kenaikan gaji dibulatkan -- ke puluhan ribu terdekat
UPDATE pegawai
SET gaji = ROUND((1+v_pct_fgaji/100)*gaji, 4) WHERE no_peg = pi_no_peg;
SQL> exec prc_upd_gaji(‘PI-10001’);
Keterangan
- CASE
WHEN v_gaji_col >= 3000000 THEN v_pct_fgaji := 5.00;
WHEN v_gaji_col >= 2000000 THEN v_pct_fgaji := 8.00;
WHEN v_gaji_col >= 1000000 THEN v_pct_fgaji := 10.00;
ELSE
v_pct_fgaji := 15.00; END CASE;
Jika gaji pegawai saat ini adalah p dan presentase kenaikan gaji yang baru adalah n, maka besarnya kenaikan gaji yang diperoleh adalah :
p ≥ 3.000.000 n = 0.05
2.000.000 ≤ p < 3.000.000 n = 0.08
1.000.000 ≤ p < 2.000.000 n = 0.10 p < 1.000.000 n = 0.15
Rangkuman
5. Percabangan (decision control / branching) adalah suatu kontrol untuk pengecekan yang dilakukan sebelum statemen-statemen dalam sebuah blok PL/SQL dieksekusi.
6. Klasifikasi decision control adalah : Statemen IF
o IF-THEN : pengecekan hanya untuk sebuah kondisi.
IF kondisi THEN statemen-statemen;
END IF;
o IF-THEN-ELSE : pengecekan untuk dua kondisi.
IF kondisi THEN
statemen-statemen A;
ELSE
statemen-statemen B;
END IF;
o IF-THEN-ELSIF : pengecekan untuk tiga kondisi atau lebih.
IF kondisi_1 THEN
statemen-statemen A;
ELSIF kondisi_2 THEN statemen-statemen B; ...
ELSIF kondisi_n THEN statemen-statemen N;
[ELSE
statemen-statemen lain;]
Statemen CASE
o Simple CASE
CASE (ekspresi)
WHEN nilai_1 THEN statemen_1; WHEN nilai_2 THEN statemen_2;
...
WHEN nilai_n THEN statemen_n; [ELSE statemen_lain;]
END CASE;
o Searched CASE
CASE
WHEN ekspresi_1 = nilai_1 THEN statemen_1; WHEN ekspresi_2 = nilai_2 THEN statemen_2;
...
WHEN ekspresi_n = nilai_n THEN statemen_n; [ELSE statemen_lain;]
END CASE;
Kuis Benar Salah
11. Statemen dalam blok IF hanya akan dieksekusi bila kondisi IF terpenuhi. 12. Untuk pengecekan yang melibatkan lebih dari dua kondisi, penggunaan
statemen IF-THEN-ELSIF atau CASE akan lebih efisien. (Untuk soal nomor 3 – 5, perhatikan blok PL/SQL berikut)
SET serveroutput ON; DECLARE nilai INT; BEGIN nilai := 8; IF nilai > 0 THEN DBMS_OUTPUT.PUT_LINE('Statemen IF 1st'); END IF; IF nilai < 10 THEN DBMS_OUTPUT.PUT_LINE('Statemen IF 2nd'); END IF; END;
13. Output dari eksekusi blok PL/SQL di atas adalah :
Statemen IF 2nd
14. Bila blok dalam BEGIN – END, diganti menjadi :
nilai := 8;
IF nilai > 0 THEN
DBMS_OUTPUT.PUT_LINE('Statemen IF 1st'); ELSIF nilai < 10 THEN
DBMS_OUTPUT.PUT_LINE('Statemen IF 2nd'); END IF;
15. Bila blok dalam BEGIN – END, diganti menjadi : nilai := 8; IF nilai > 0 THEN DBMS_OUTPUT.PUT_LINE('Statemen IF 1st'); ELSE THEN DBMS_OUTPUT.PUT_LINE('Statemen IF 2nd'); END IF;
Maka output dari eksekusi blok PL/SQL di atas menjadi :
Statemen IF 1st
16. Pada blok CASE, semua kondisi WHEN akan dicek sebelum akhirnya melanjutkan eksekusi statemen di bawah blok CASE tersebut.
(Untuk soal nomor 7 - 9, perhatikan blok PL/SQL berikut)
SET serveroutput ON; DECLARE nilai DEC(5,2); indeks CHAR; BEGIN nilai := 60; CASE
WHEN nilai > 80.00 THEN indeks := ‘A’;
WHEN nilai > 60 THEN indeks := ‘B’; WHEN nilai > 50 THEN
indeks := ‘C’; ELSE indeks := ‘D’; END CASE; DBMS_OUTPUT.PUT_LINE(indeks); END;
17. Output dari eksekusi blok PL/SQL di atas adalah :
18. Bila blok dalam BEGIN - END, diganti menjadi :
nilai := 60; CASE
WHEN nilai >= 80.00 THEN indeks := ‘A’;
WHEN nilai >= 60 THEN indeks := ‘B’; WHEN nilai >= 50 THEN
indeks := ‘C’; ELSE
indeks := ‘D’; END CASE;
DBMS_OUTPUT.PUT_LINE(indeks);
Maka output dari eksekusi blok PL/SQL di atas menjadi :
B
19. Bila blok dalam BEGIN - END, diganti menjadi :
nilai := 60; CASE nilai WHEN >= 80.00 THEN indeks := ‘A’; WHEN >= 60 THEN indeks := ‘B’; WHEN >= 50 THEN indeks := ‘C’; ELSE indeks := ‘D’; END CASE; DBMS_OUTPUT.PUT_LINE(indeks);
Maka output dari eksekusi blok PL/SQL di atas menjadi :
B
20. Bila baris :
ELSE
Latihan
Untuk soal nomor 1 – 3, perhatikan table employee_tab berikut :
emp_id mgr_id dept_id emp_name emp_salary
EM-10001 MG-10006 SAL Sarah 400
EM-10002 MG-10006 SAL John 400
EM-10003 MG-10007 HR Michael 400
EM-10004 MG-10007 HR George 400
EM-10005 MG-10006 SAL Henk 400
MG-10006 NULL SAL Natalie 800
MG-10007 NULL HR Matt 800
... ... ... ... ...
o emp_id : id employee; mgr_id : id manager; dept_id : id department; emp_name : employee‘s name, emp_salary : employee‘s salary.
o emp_id dengan awalan ‖MG-‖ menyatakan bahwa ia adalah seorang manager dari department tertentu.
16. Buatlah sebuah prosedur untuk menghitung jumlah karyawan dalam department SAL :
o Jumlah karyawan akan dicetak ke layar.
o Jika jumlah karyawan = 0 maka akan diberi keterangan ‖Department
belum berfungsi‖ ke layar.
o Jika jumlah karyawan antara 1 – 10 maka akan diberi keterangan ‖Department kecil‖ ke layar.
o Jika jumlah karyawan antara 11 – 20 maka akan diberi keterangan ‖Department menengah‖ ke layar.
o Jika jumlah karyawan lebih dari 20 maka akan diberi keterangan ‖Department besar‖ ke layar.
17. Buatlah sebuah fungsi untuk mengecek apakah karyawan dengan id tertentu adalah seorang manager atau bukan :
o Fungsi memiliki emp_id sebagai parameter input.
o Fungsi akan mengembalikan TRUE bila emp_id yang dimasukkan adalah milik seorang manager, dan FALSE bila sebaliknya.
(Gunakan salah satu sintaks decision control yang paling efisien dan gunakan operator LIKE).
18. Buatlah sebuah blok PL/SQL (atau prosedur/fungsi) yang akan mengupdate salary dengan ketentuan :
o Jika seseorang adalah manager dari departemen apapun, maka akan mendapat kenaikan gaji sebesar 20% dari gaji semula.
o Jika seseorang adalah karyawan biasa di departemen SAL, maka akan mendapat kenaikan gaji sebesar 15% dari gaji semula.
o Jika seseorang adalah karyawan biasa di departemen HR, maka akan mendapat kenaikan gaji sebesar 10% dari gaji semula.
o Jika seseorang adalah karyawan biasa di departemen selain SAL dan HR, maka akan mendapat kenaikan gaji sebesar 5% dari gaji semula. (Gunakan HANYA satu buah decision control yang paling sesuai).
6
Lebih Lanjut Mengenai Prosedural
-Iterasi, Cursor, dan Exception Handling-
Overview
Pada sebuah blok PL/SQL dapat ditempatkan suatu kontrol untuk pengulangan eksekusi suatu blok statemen berdasarkan kondisi tertentu, penggunaan cursor secara implisit maupun eksplisit, dan menempatkan blok penanganan terhadap exception yang mungkin timbul.
Tujuan
1. Mahasiswa memahami konsep dan penggunaan perulangan (iterasi). 2. Mahasiswa memahami konsep dan penggunaan cursor.