4/26/2010
Mengontrol Alur Eksekusi PL/SQL
Kondisi dan Perulangan
Danny Kriestanto Based on Oracle 9i: Program with PL/SQL Student Guide 1
Urutan logika eksekusi perintah dapat diubah dengan menggunakan pernyataan IF dan struktut kontrol perulangan Kondisi pernyataan IF: IF-THEN-END IF IF-THEN-ELSE-END IF IF-THEN-ELSIF-END IF
2
Pernyataan IF
Contoh IF
Sintaks: IF kondisi THEN pernyataan; [ELSIF kondisi THEN pernyataan;] [ELSE pernyataan;] Jika pegawai bernama Gietz, ubah manager ID-nya menjadi 102. IF UPPER(v_last_name) = ‘Gietz’ THEN v_mgr = 102; END IF;
Jika nama akhir Vargas: Ubah job ID menjadi SA_REP Ubah nomor departmen menjadi 80 … IF v_nama = ‘Vargas’ THEN v_kerja := ‘SA_REP’; v_nodep := 80; END IF; …
3
Contoh IF
4
Alur Eksekusi IF-THEN-ELSE
Jika nama akhir Vargas dan gajinya lebih besar dari 6500, ubah nomor departemen menjadi 60 TRUE
… IF v_nama = ‘Vargas’ AND salary > 6500 THEN v_nodep := 60; END IF; …
5
Kondisi IF
THEN
FALSE
ELSE
6
1
4/26/2010
Pernyataan IF-THEN-ELSE
Pernyataan IF-THEN-ELSE
Set variabel boolean menjadi TRUE jika tanggal karyawan mulai dipekerjakan lebih besar dari 5 tahun; jika tidak, set ke FALSE. DECLARE v_tgl_kerja DATE := ’12-Dec-1990’; v_lima_thn BOOLEAN; BEGIN … IF MONTHS_BETWEEN(sysdate, v_hire_date)/12 > 5 THEN v_lima_thn := TRUE; ELSE v_lima_thn := FALSE: END IF; END; / 7
IF v_nama_peg = ‘King’ THEN v_kerja = ‘AD_PRES’; ELSE v_kerja = ‘ST_CLERK’; END IF;
Alur Eksekusi IF-THEN-ELSIF
Pernyataan IF-THEN-ELSIF
TRUE
Kondisi IF
Dari nilai yang ada, hitung persentase dari nilai tersebut berdasarkan kondisi tertentu
FALSE
TRUE
Kondisi ELSIF
THEN
THEN
8
FALSE
ELSE
… IF v_mulai > 100 v_mulai := 0.2 ELSIF v_mulai >= v_mulai := 0.5 ELSE v_mulai := 0.1 END IF; …
9
THEN * v_mulai; 50 THEN * v_mulai; * v_mulai;
10
Pernyataan IF-THEN-ELSIF
Ekspresi CASE
IF v_no_dep = 10 THEN v_bonus := 5000; ELSIF v_no_dep = 80 THEN v_bonus := 7500; ELSE v_bonus := 2000; END IF;
Ekspresi CASE digunakan untuk memilih sebuah pilihan dan mengembalikan hasilnya Untuk memilih pilihan tersebut, CASE menggunakan sebuah ekspresi dimana nilai yang digunakan untuk memilih satu di antara banyak alternatif CASE pilihan WHEN ekspresi1 THEN hasil1 WHEN ekspresi2 THEN hasil2 … WHEN ekspresiN THEN hasilN [ELSE hasilN+1]; END;
11
12
2
4/26/2010
Contoh Ekspresi CASE
Penanganan nilai NULL
SET SERVEROUTPUT ON DECLARE v_peringkat CHAR(1) := UPPER(&p_peringkat); v_penilaian VARCHAR2(20); BEGIN v_penilaian := CASE v_peringkat pe ingkat WHEN ‘A’ THEN ‘Luar Biasa’ WHEN ‘B’ THEN ‘Sangat Baik’ WHEN ‘C’ THEN ‘Baik’ ELSE ‘Tidak ada peringkat’; DBMS_OUTPUT.PUT_LINE(‘Peringkat ’||v_peringkat|| ‘ Penilaiannya ’||v_penilaian); END; /
Ketika bekerja dengan nilai null, hindari beberapa kesalahan umum dengan mengingat beberapa peraturan berikut: Perbandingan sederhana yang melibatkan nilai null selalu menghasilkan NULL Mengaplikasikan operator logika NOT pada sebuah nilai null menghasilkan NULL Dalam pernyataan kondisi, jika kondisi menghasilkan NULL, urutan yang mengikutinya tidak akan dijalankan (akan dilewati)
13
14
Penanganan nilai NULL
Tabel Logika
x := 5; y := NULL; … IF x != y THEN -- menghasilkan nilai NULL, bukan TRUE urutan_pernyataan; -- tidak dieksekusi END IF;
Buat sebuah kondisi BOOLEAN sederhana dengan operator perbandingan
a := NULL; b := NULL; … IF x = y THEN – menghasilkan nilai NULL, bukan TRUE urutan_pernyataan; -- tidak dieksekusi END IF;
15
AND
TRUE
FALSE
NULL
OR
TRUE
FALSE
NULL
TRUE
TRUE
FALSE
NULL
TRUE
TRUE
TRUE
TRUE
FALSE
FALSE
FALSE
FALSE
FALSE
TRUE
FALSE
NULL
NULL
NULL
FALSE
NULL
NULL
TRUE
NULL
NULL
NOT TRUE
FALSE
FALSE
TRUE
NULL
NULL
16
Kondisi BOOLEAN
Perulangan : perintah LOOP
Apa nilai dari v_flag pada setiap kasus di bawah ini?
Loop digunakan untuk mengulangi pernyataan atau urutan dari pernyataan sebanyak beberapa kali Pada PL/SQL ada tiga macam tipe perulangan: Perulangan dasar Perulangan FOR Perulangan WHILE
v_flag := v_reorder_flag AND v_available_flag;
v_reorder_flag
v_available_flag
v_flag
TRUE
TRUE
?
TRUE
FALSE
?
NULL
TRUE
?
NULL
FALSE
?
17
18
3
4/26/2010
Perulangan Dasar
Perulangan Dasar
Sintaks: LOOP pernyataan1; . . . EXIT [WHEN kondisi] END LOOP;
-- delimiter -- pernyataan -- pernyataan EXIT
kondisi adalah variabel boolean atau ekspresi (TRUE, FALSE, NULL)
Contoh: DECLARE v_country_id locations.country_id%TYPE := ‘CA’; v_location_id locations.location_id%TYPE; v_hitung NUMBER(2) := 1; v_city locations.ciry%TYPE := ‘Montreal’; BEGIN SELECT MAX(location_id) INTO v_location_id FROM locations WHERE country_id = v_country_id; LOOP INSERT INTO locations(location_id,city,country_id) VALUES ((v_location_id+v_hitung)), v_city, v_country_id); v_hitung := v_hitung + 1; EXIT WHEN v_counter > 3; END LOOP; END; /
19
20
Perulangan WHILE
Perulangan WHILE
Sintaks: WHILE kondisi LOOP pernyataan1; pernyataan2; . . . END LOOP;
Contoh: kondisi dievaluasi di awal tiap iterasi
Gunakan perulangan WHILE untuk mengulangi pernyataan jika kondisinya TRUE
DECLARE v_country_id locations.country_id%TYPE := ‘CA’; v_location_id locations.location_id%TYPE; v_hitung NUMBER(2) := 1; v_city locations.ciry%TYPE := ‘Montreal’; BEGIN SELECT MAX(location_id) MAX(l ti id) INTO v_location_id l ti id FROM locations WHERE country_id = v_country_id; WHILE v_hitung <= 3 LOOP INSERT INTO locations(location_id,city,country_id) VALUES ((v_location_id+v_hitung)), v_city, v_country_id); v_hitung := v_hitung + 1; END LOOP; END; /
21
22
Perulangan FOR
Perulangan FOR
Sintaks:
Masukkan tiga ID lokasi baru ke kode country dan kota Montreal
FOR pencacah IN [REVERSE] batas_bawah..batas_atas LOOP pernyataan1; pernyataan2; . . . END LOOP;
Gunakan G k perulangan l FOR sebagai b i shortcut h t t untuk menguji banyaknya jumlah iterasi Tidak perlu mendeklarasikan pencacah karena sudah dideklarasikan secara implisit ‘batas_bawah..batas_atas’ harus ada 23
DECLARE v_country_idlocations.country_id%TYPE := ‘CA’; v_location_id locations.location_id%TYPE; v_city locations.city%TYPE := ‘Montreal’; BEGIN SELECT MAX(location_id) INTO v_location_id FROM locations WHERE country_id = v_country_id; FOR i IN 1..3 LOOP INSERT INTO locations(location_id,city,country_id) VALUES ((v_location_id+v_hitung)), v_city, v_country_id); END LOOP; END; / 24
4
4/26/2010
Panduan Ketika Menggunakan Perulangan
Perulangan FOR Panduan: Referensikan pencacah hanya di dalam perulangan, diluar perulangan pencacah tersebut tidak dikenal Jangan mereferensikan pencacah sebagai target dari penugasan
25
Gunakan perulangan dasar ketia pernyataan di dalam perulangan harus dieksekusi setidaknya satu kali. Gunakan perulangan WHILE jika kondisi harus dievaluasi di awal dari tiap i iterasi. i i Gunakan perulangan FOR jika jumlah iterasi telah diketahui.
26
Nested Loop dan Label
Nested Loop dan Label
Perulangan dapat dilakukan di dalam sebuah perulangan lain Gunakan label untuk membedakan antara blok dan perulangan. Untuk keluar dari perulangan yang berada paling luar, menggunakan perintah EXIT yang mereferensikan pada label.
. . . BEGIN <
> LOOP v_hitung := v_hitung + 1; EXIT WHEN v_hitung > 10; <> LOOP . . . EXIT perulangan_luar WHEN selesai = ‘YES’; -- keluar dari kedua perulangan EXIT ulang_dalam WHEN selesai_dlm = ‘YES’; -- Keluar hanya dari perulangan dalam . . . END ulang_dalam; . . . END LOOP perulangan_luar; END;
27
28
5