Writing Control Structures
Mengendalikan Arus Eksekusi PL / SQL
• Anda dapat mengubah eksekusi logis dari pernyataan bersyarat menggunakan pernyataan IF dan struktur kendali loop.
• Pernyataan bersyarat IF :
– IF-THEN-END IF
– IF-THEN-ELSE-END IF
– IF-THEN-ELSIF-END IF
Pernyataan IF
Syntax:
IF condition THEN
statements;
[ELSIF condition THEN
statements;]
[ELSE
statements;]
END IF;
Jika nama karyawan adalah Gietz, ubah Manager ID jadi 102.
IF UPPER(v_last_name) = 'GIETZ' THEN
v_mgr := 102;
END IF;
Pernyataan IF Sederhana
Jika last name adalah Vargas:
• Ubah job ID jadi SA_REP
• Ubah department number jadi 80
. . .
IF v_ename = 'Vargas' THEN
v_job := 'SA_REP';
v_deptno := 80;
END IF;
. . .
Compound pernyataan IF
Jika last name adalah Vargas dan salary lebih dari 6500:
Ubah department number jadi 60.
. . .
IF v_ename = 'Vargas' AND salary > 6500 THEN
v_deptno := 60;
END IF;
. . .
Pernyataan Arus Eksekusi IF-THEN-ELSE
IF condition TRUE
THEN actions
(including further IF
statements)
IF condition NOT TRUE
ELSE actions
(including further IF
statements)
Pernyataan IF-THEN-ELSE
Atur Boolean jadi TRUE jika hire date lebih besar dari 5 tahun; Jika tidak atur Boolean jadi FALSE.
DECLARE
v_hire_date DATE := '12-Dec-1990';
v_five_years BOOLEAN;
BEGIN
. . .
IF MONTHS_BETWEEN(SYSDATE,v_hire_date)/12 > 5 THEN
v_five_years := TRUE;
ELSE
v_five_years := FALSE;
END IF;
...
IF-THEN-ELSIF
Pernyataan Arus Eksekusi
IF condition TRUE
- THEN actions
IF condition NOT TRUE
- ELSIF condition
o TRUE
§ THEN actions
o NOT TRUE
§ ELSE actions
Pernyataan IF-THEN-ELSIF
Untuk nilai yang diberikan, menghitung persentase nilai berdasarkan suatu kondisi..
Contoh:
. . .
IF v_start > 100 THEN
v_start := 0.2 * v_start;
ELSIF v_start >= 50 THEN
v_start := 0.5 * v_start;
ELSE
v_start := 0.1 * v_start;
END IF;
. . .
KASUS Ekspresi
• Sebuah ekspresi KASUS memilih hasil dan mengembalikannya.
• Untuk memilih hasilnya, ekspresi KASUS menggunakan ekspresi yang nilainya digunakan untuk memilih salah satu dari beberapa alternatif.
• Untuk memilih hasilnya, ekspresi KASUS menggunakan ekspresi yang nilainya digunakan untuk memilih salah satu dari beberapa alternatif.
CASE selector
WHEN expression1 THEN result1
WHEN expression2 THEN result2
...
WHEN expressionN THEN resultN
[ELSE resultN+1;]
END;
Contoh CASE Expressions
SET SERVEROUTPUT ON
DECLARE
v_grade CHAR(1) := UPPER('&p_grade');
v_appraisal VARCHAR2(20);
BEGIN
v_appraisal :=
CASE v_grade
WHEN 'A' THEN 'Excellent'
WHEN 'B' THEN 'Very Good'
WHEN 'C' THEN 'Good'
ELSE 'No such grade'
END;
DBMS_OUTPUT.PUT_LINE ('Grade: '|| v_grade || '
Appraisal ' || v_appraisal);
END;
/
Penanganan Nulls
Ketika bekerja dengan nulls, Anda dapat menghindari beberapa kesalahan umum dengan mengingat aturan berikut:
• Perbandingan sederhana yang melibatkan nulls selalu menghasilkan NULL.
• Menerapkan operator logika NOT NULL ke hasil nol.
• Dalam laporan kontrol kondisional, jika kondisi hasil NULL, urutan terkait dari
pernyataan tidak dieksekusi.
• Menerapkan operator logika NOT NULL ke hasil nol.
• Dalam laporan kontrol kondisional, jika kondisi hasil NULL, urutan terkait dari
pernyataan tidak dieksekusi.
Tabel Logika
Membangun suatu kondisi Boolean sederhana dengan operator perbandingan.
NOT | |
TRUE | FALSE |
FALSE | TRUE |
NULL | NULL |
OR | TRUE | FALSE | NULL |
TRUE | TRUE | TRUE | TRUE |
FALSE | TRUE | FALSE | NULL |
NULL | TRUE | NULL | NULL |
AND | TRUE | FALSE | NULL |
TRUE | TRUE | FALSE | NULL |
FALSE | FALSE | FALSE | FALSE |
NULL | NULL | FALSE | NULL |
Kondisi boolean
Apa nilai V_FLAG dalam setiap kasus?
V_REORDER_FLAG | V_AVAILABLE_FLAG | V_FLAG |
TRUE | TRUE | ? |
TRUE | FALSE | ? |
NULL | TRUE | ? |
NULL | FALSE | ? |
Iterative Control: LOOP Statements
• Loops mengulangi pernyataan atau urutan pernyataan beberapa kali..
• Ada tiga jenis loop:
– Basic loop
– FOR loop
– WHILE loop
Basic Loops
Syntax:
LOOP
statement1;
. . .
EXIT [WHEN condition];
END LOOP;
kondisi adalah variabel Boolean atau ekspresi (TRUE, FALSE, atau NULL);
Contoh:
DECLARE
v_country_id locations.country_id%TYPE := 'CA';
v_location_id locations.location_id%TYPE;
v_counter NUMBER(2) := 1;
v_city locations.city%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_counter),v_city, v_country_id);
v_counter := v_counter + 1;
EXIT WHEN v_counter > 3;
END LOOP;
END;
/
WHILE Loops
Syntax:
WHILE condition LOOP
statement1;
statement2;
. . .
END LOOP;
Gunakan WHILE loop untuk mengulang pernyataan sementara kondisi adalah TRUE.
Contoh:
DECLARE
v_country_id locations.country_id%TYPE := 'CA';
v_location_id locations.location_id%TYPE;
v_city locations.city%TYPE := 'Montreal';
v_counter NUMBER := 1;
BEGIN
SELECT MAX(location_id) INTO v_location_id FROM locations
WHERE country_id = v_country_id;
WHILE v_counter <= 3 LOOP
INSERT INTO locations(location_id, city, country_id)
VALUES((v_location_id + v_counter), v_city, v_country_id);
v_counter := v_counter + 1;
END LOOP;
END;
/
FOR Loops
Syntax:
FOR counter IN [REVERSE]
lower_bound..upper_bound LOOP
statement1;
statement2;
. . .
END LOOP;
• Gunakan FOR loop sebagai jalan pintas untuk tes jumlah iterasi.
• Jangan mendeklarasikan counter; karena dinyatakan secara implisit.
• lower_bound '.. 'upper_bound adalah sintaks yang diperlukan.
• Jangan mendeklarasikan counter; karena dinyatakan secara implisit.
• lower_bound '.. 'upper_bound adalah sintaks yang diperlukan.
Masukkan tiga lokasi ID baru untuk kode negara CA dan kota Montreal.
DECLARE
v_country_id locations.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 + i), v_city, v_country_id );
END LOOP;
END;
/
Pedoman
• Referensi counter dalam loop saja; itu terdefinisi luar loop.
• Jangan referensi counter sebagai sasaran tugas.
• Referensi counter dalam loop saja; itu terdefinisi luar loop.
• Jangan referensi counter sebagai sasaran tugas.
Pedoman Sementara Menggunakan Loops
• Gunakan basic loop ketika pernyataan dalam loop harus menjalankan setidaknya sekali.
• Gunakan WHILE loop jika kondisi harus dievaluasi pada awal setiap iterasi.
• Gunakan FOR loop jika jumlah iterasi diketahui.
• Gunakan WHILE loop jika kondisi harus dievaluasi pada awal setiap iterasi.
• Gunakan FOR loop jika jumlah iterasi diketahui.
Nested Loops and Labels
• Nest loops untuk beberapa tingkatan.
• Gunakan label untuk membedakan antara blok dan loop.
• Keluar dari outer loop dengan pernyataan EXIT yang mereferensi label.
...
BEGIN
<<Outer_loop>>
LOOP
v_counter := v_counter+1;
EXIT WHEN v_counter>10;
<<Inner_loop>>
LOOP
...
EXIT Outer_loop WHEN total_done = 'YES';
-- Leave both loops
EXIT WHEN inner_done = 'YES';
-- Leave inner loop only
...
END LOOP Inner_loop;
...
END LOOP Outer_loop;
END;
Tidak ada komentar:
Posting Komentar