• Tidak ada hasil yang ditemukan

Statemen CASE

Dalam dokumen DAFTAR ISI - System Manajemen Basis Data (Halaman 74-86)

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.

Dalam dokumen DAFTAR ISI - System Manajemen Basis Data (Halaman 74-86)