Sabtu, 07 Januari 2012

Resume PBD 2 Pert 4 & 5


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.

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.

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.

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
.

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.

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