boykap.files.wordpress.com€¦ · web...
TRANSCRIPT
คำ�สัง่ตรวจเชค็เง่ือนไขและคำ�สัง่ควบคมุก�รวนซำ��
ก�รใชค้ำ�สัง่ตรวจเชค็เง่ือนไขและคำ�สัง่ควบคมุก�รวนซำ��
คำ�สัง่ตรวจเชค็เง่ือนไข (Condition Statement) และคำ�
สัง่ควบคมุก�รวนซำ�� (Loop Statement) จดัเป็นลักษณะท่ี
สำ�คัญของภ�ษ�คอมพวิเตอรท์ัว่ๆไป ท่ีใชใ้นก�รสร�้งโปรแกรม
ประยุกต์ (Application Program) ภ�ษ� PL/SQL ถกูสร�้งขึ�น
ม�เพื่อเขยีนโปรแกรมจดัก�รง�นต่�งๆในระบบฐ�นขอ้มูล และใชใ้น
ก�รสร�้งโปรแกรมประยุกต์ ดังนั�นในก�รศึกษ�ก�รเขยีนโปรแกรม
ด้วยภ�ษ� PL/SQL บทนี�จะกล่�วถึงรูปแบบของคำ�สัง่ตรวจเชค็
เง่ือนไขและคำ�สัง่ควบคมุก�รวนซำ��ของ ภ�ษ� PL/SQL
ก�รใชค้ำ�สัง่ Condition Statement ในโปรแกรมภ�ษ� PL/SQL
ในภ�ษ� PL/SQL จะใชค้ำ�สัง่ตรวจเชค็เง่ือนไข (Condition Statement) ใชใ้นก�รตรวจเชค็เง่ือนไขท่ีกำ�หนดไว ้เพื่อตัดสนิใจว่�
โปรแกรมจะเลือกคำ�สัง่หรอืชุดคำ�สัง่ใดม�ทำ�ง�นใหต้รงจุดประสงค์
ของโปรแกรม โดยเง่ือนไข (Condition) คือตัวแปร Boolean หรอื expression ท่ีได้ผลลัพธเ์ป็นค่� Boolean ในบทนี�จะแบง่คำ�
สัง่ตรวจเชค็เง่ือนไข ออกเป็น 4 แบบ โดยมรูีปแบบคำ�สัง่เป็นดังต่อ
ไปนี�
1.คำ�สัง่ตรวจเชค็เง่ือนไข IF- THEN Statement
ก�รตรวจเชค็เง่ือนไขประโยคเดียวเป็นก�รตรวจสอบเง่ือนไขว�่เป็นจรงิหรอืเท็จ แล้วใหท้ำ�ชุดคำ�สัง่นั�นๆถ้�เง่ือนไขนั�นเป็นจรงิ
รูปแบบคำ�สัง่ IF-THEN ในโปรแกรมภ�ษ� PL/SQL:
BEGIN IF condition THEN {...statements to execute when condition is TRUE...} END IF;END;
ตัวอย�่งท่ี 1 ก�รใชค้ำ�สัง่ IF-THEN ในโปรแกรมภ�ษ� PL/SQL:DECLARE a NUMBER :=10;BEGIN
dbms_output.put_line('Program started.' );IF( a > 100 ) THEN
dbms_output.put_line('a is greater than 100'); END IF;dbms_output.put_line('Program completed.');
END;
ตัวอย�่งท่ี 2 ก�รใชค้ำ�สัง่ IF-THEN ในโปรแกรมภ�ษ� PL/SQL:
ในตัวอย�่งนี� ต้องก�รท่ีจะแสดงขอ้คว�มว�่ 'The character is in English Vowels' เมื่อตัวอักษรท่ีรบัขอ้มูลจ�ก user ม�นั�นเป็นสระในภ�ษ�อังกฤษ (A, E, I, O, U)
คำ�สัง่โปรแกรมภ�ษ� PL/SQL:
DECLARE a CHAR(1) := '& character';BEGIN IF UPPER(a) in ('A','E','I','O','U' ) THEN dbms_output.put_line('The character is in English Vowels'); END IF;END;
หม�ยเหต:ุ ในกรณีท่ีเง่ือนไขที่ทำ�ก�รตรวจสอบนั�นเป็นตัวอักษรหรอื Data/Time Format จะต้องเขยีนใหอ้ยูภ่�ยใต้เครื่องหม�ย ‘ ’
2.คำ�สัง่ตรวจเชค็เง่ือนไข IF-THEN-ELSE Statement
ก�รตรวจเชค็เง่ือนไข IF-THEN-ELSE เป็นก�รตรวจสอบว�่ ห�กเง่ือนไขท่ีใชใ้นก�รตรวจเชค็เป็นจรงิ ก็จะดำ�เนินก�รกับชุดคำ�สัง่ท่ีกำ�หนดไว ้และห�กเง่ือนไขเป็นเท็จ ก็จะดำ�เนินก�รกับชุดคำ�สัง่หลังประโยค else
รูปแบบคำ�สัง่ IF-THEN-ELSE ในโปรแกรมภ�ษ� PL/SQL:
BEGIN IF condition THEN {...statements to execute when condition is TRUE...}
ELSE {...statements to execute when condition is FALSE...}
END IF;END;
ตัวอย�่งท่ี 3 ก�รใชค้ำ�สัง่ IF-THEN-ELSE ในโปรแกรมภ�ษ� PL/SQL:
ในตัวอย�่งนี� ต้องก�รท่ีจะแสดงขอ้คว�มว�่ 'a is even number' เมื่อตัวเลขท่ีรบัขอ้มูลจ�ก user ม�นั�นเป็นเลขคู่ และจะแสดงขอ้คว�มว�่ 'a is odd number'เมื่อตัวเลขท่ีรบัขอ้มูลจ�ก user ม�นั�นเป็นเลขค่ี
คำ�สัง่โปรแกรมภ�ษ� PL/SQL:
DECLARE a NUMBER := &Number;BEGINdbms_output.put_line ('Program started'); IF( mod(a,2)=0) THEN dbms_output.put_line('a is even number' ); ELSE dbms_output.put_line('a is odd number'); END IF;dbms_output.put_line ('Program completed.');END;
3.คำ�สัง่ตรวจเชค็เง่ือนไข IF-THEN-ELSIF Statementก�รตรวจเชค็เง่ือนไข IF-THEN-ELSEIF จะใชใ้นกรณีท่ี
ต้องก�รเลือกจ�กท�งเลือกม�กว�่ 2 ท�งเลือก โดยใชผ้ลก�รตรวจสอบเง่ือนไขท่ีแตกต่�งกัน โดยส�ม�รถเขยีนโครงสร�้ง elseif ได้
ดังนี�
รูปแบบคำ�สัง่ IF-THEN-ELSIF ในโปรแกรมภ�ษ� PL/SQL:
BEGIN IF condition1 THEN {...statements to execute when condition1 is TRUE...}
ELSIF condition2 THEN {...statements to execute when condition2 is TRUE...}
END IF;END;
ตัวอย�่งท่ี 4 ก�รใชค้ำ�สัง่ IF-THEN-ELSIF ในโปรแกรมภ�ษ� PL/SQL:
ตัวอย�่งนี� จะเป็นก�รเขยีนโปรแกรมตัดเกรด โดยรบัค่�คะแนนจ�ก
user ม�ทำ�ก�รตรวจสอบเง่ือนไข โดยเง่ือนไขท่ีใชใ้นก�รตรวจสอบมี
ดังต่อไปนี�
คะแนน >= 70 Grade A. คะแนน >=40 and คะแนน <70 Grade B. คะแนน >=35 and คะแนน < 40 Grade C.
โดยท่ีไมม่คีำ�สัง่ ELSE หลังจ�กก�รตรวจสอบเง่ือนไขเสรจ็
สิ�น นัน่หม�ยคว�มว�่ ถ้�ก�รตรวจสอบเง่ือนไขใหผ้ลเป็นเท็จ
(False) ก็จะสิ�นสดุก�รทำ�ง�นของ
คำ�สัง่โปรแกรมภ�ษ� PL/SQL:
DECLARE mark NUMBER := &score;BEGINdbms_output.put_line('Program started. ' ); IF( mark >= 70) THEN dbms_output.put_line('Grade A'); ELSIF(mark >= 40 AND mark < 70) THEN dbms_output.put_line('Grade B'); ELSIF(mark >=35 AND mark < 40) THEN dbms_output.put_line('Grade C'); END IF;dbms_output.put_line('Program completed.'); END;
4.คำ�สัง่ตรวจเชค็เง่ือนไข IF-THEN-ELSIF-ELSE Statement
คำ�สัง่ IF-THEN-ELSEIF-ELSE จะใชเ้มื่อต้องก�รตรวจสอบเง่ือนไขหล�ยเง่ือนไข และจะทำ�คำ�สัง่ท่ีต้องก�รถ้�เง่ือนไขนั�นแรกเป็น
จรงิ หรอืทำ�อีกชุดคำ�สัง่ถ้�เง่ือนไขอีกเง่ือนไขอีกเง่ือนไขเป็นจรงิ และจะใหท้ำ�อีกชุดคำ�สัง่ถ้�เง่ือนไขทั�งหมดที่มนัี�นเป็นเท็จในขั�นตอนสดุท้�ยของก�รตรวจสอบเง่ือนไข
รูปแบบคำ�สัง่ IF-THEN-ELSIF-ELSE ในโปรแกรมภ�ษ� PL/SQL:
BEGIN IF condition1 THEN {...statements to execute when condition1 is TRUE...} ELSIF condition2 THEN {...statements to execute when condition2 is TRUE...} ELSE {...statements to execute when both condition1 and condition2 are FALSE...}END IF;END;
ตัวอย�่งท่ี 5 ก�รใชค้ำ�สัง่ IF-THEN-ELSIF-ELSE ในโปรแกรมภ�ษ� PL/SQL:
ตัวอย�่งนี�จะเป็นก�รเขยีนโปรแกรมตัดเกรด โดยรบัค่�คะแนนจ�ก
user ม�ทำ�ก�รตรวจสอบเง่ือนไข โดยเง่ือนไขเชน่เดียวกันกับ
ตัวอย�่งท่ีผ่�นม� โดยท่ีหลังจ�กก�รตรวจสอบเง่ือนไขที่มอียูทั่�งหมด
เสรจ็สิ�น แล้วไมม่เีง่ือนไขใดตรงกับเง่ือนไขท่ีกำ�หนดไวซ้ึ่งใหผ้ลท่ีได้จะ
เป็นเท็จ (False) จะใหโ้ปรแกรมแสดงขอ้คว�มว�่ 'No Grade'ขึ�นม�
บนหน้�จอ
คำ�สัง่โปรแกรมภ�ษ� PL/SQL:
DECLARE mark NUMBER := &score;BEGINdbms_output.put_line('Program started.'); IF( mark >= 70) THEN dbms_output.put_line('Grade A'); ELSIF(mark >= 40 AND mark < 70) THEN dbms_output.put_line('Grade B'); ELSIF(mark >=35 AND mark < 40) THEN dbms_output.put_line('Grade C'); ELSE dbms_output.put_line('No Grade'); END IF;dbms_output.put_line('Program completed.' ); END;
ก�รใชค้ำ�สัง่ NESTED-IF Statement ในโปรแกรมภ�ษ� PL/SQL
เป็นก�รสร�้งรูปแบบเง่ือนไขท่ีซบัซอ้นยิง่ขึ�นโดยจะมกี�รตรวจสอบเง่ือนไขซอ้นยอ่ยลงไปอีก ซึ่งก�รสร�้งประโยคซอ้นเง่ือนไขดังกล่�วจำ�เป็นต้องตรวจสอบใหร้อบคอบมฉิะนั�นอ�จเกิดผลลัพธท่ี์ผิดพล�ดได้ โครงสร�้งของก�รใชค้ำ�สัง่ตรวจเชค็เง่ือนไขแบบซอ้นจะมีโครงสร�้งดังนี�
รูปแบบคำ�สัง่ NESTED-IF Statement ในโปรแกรมภ�ษ� PL/SQL:
BEGIN IF <condition1> THEN —executed only if the condition returns TRUE <action block1 starts>
IF <condition2> THEN<action_block2>
END IF; —END IF corresponds to condition2 <action_blockl ends> END IF; —END IF corresponds to condition1END;
ก�รตรวจสอบเง่ือนไขท่ีซอ้นอยูใ่นเง่ือนไขอีกชั�น
ตัวอย�่งท่ี 6 ก�รใชค้ำ�สัง่ Nested- If Statement ในโปรแกรมภ�ษ� PL/SQL:
ตัวอย�่งนี�จะเป็นก�รตรวจสอบเง่ือนไขของตัวเลข 3 ตัว ท่ีได้เก็บไวใ้นตัวแปร a,b,c โดยใชค้ำ�สัง่ Nested-If เพื่อแสดงค่�ที่มค่ี�ม�กท่ีสดุของตัวเลขทั�ง 3 ตัวนี�ออกม�
คำ�สัง่โปรแกรมภ�ษ� PL/SQL:
DECLARE a NUMBER :=10; b NUMBER :=15; c NUMBER :=20;BEGINdbms_output.put_line('Program started.' );IF( a > b)THEN /*Nested-if l */
dbms_output.put_line('Checking Nested-IF 1'); IF( a > c ) THEN dbms_output.put_line('A is greatest'); ELSE dbms_output.put_line('C is greatest'); END IF;
ELSE /*Nested-if2 */dbms_output.put_line('Checking Nested-IF 2' );
IF( b > c ) THEN dbms_output.put_lme('B is greatest' ); ELSE dbms_output.put_lme('C is greatest' ); END IF;
END IF;dbms_output.put_line('Program completed. ' );END;
ก�รใชค้ำ�สัง่ CASE Statement ในโปรแกรมภ�ษ� PL/SQL
ก�รเขยีนโปรแกรมเพื่อตรวจเชค็เง่ือนไขที่ซบัซอ้น จะทำ�ได้โดยใชค้ำ�สัง่ IF-THEN-ELSIF-ELSE หรอืใชค้ำ�สัง่ Nested- If ต�มท่ีกล่�วม� ในหวัขอ้นี�จะแนะนำ�คำ�สัง่ CASE ซึ่งเป็นอีกท�งเลือกของก�รใชค้ำ�สัง่เพื่อตรวจเชค็เง่ือนไขที่ซบัซอ้น บ�งสถ�นก�รณ์คำ�สัง่ CASE จะชว่ยใหก้�รตรวจเชค็เง่ือนไขที่ซบัซอ้นจะทำ�ได้สะดวกกว�่ก�รใชค้ำ�สัง่ IF-THEN-ELSIF-ELSE หรอืใชค้ำ�สัง่ Nested- If โครงสร�้งของก�รใชค้ำ�สัง่ตรวจเชค็เง่ือนไขแบบ CASE จะมีโครงสร�้งดังนี�
รูปแบบคำ�สัง่ CASE Statement ในโปรแกรมภ�ษ� PL/SQL:
BEGIN CASE (expression) WHEN <valuel> THEN action_blockl; WHEN <value2> THEN action_block2;
WHEN <value3> THEN action_block3; ELSE action_block_default; END CASE;END;
ตัวอย�่งท่ี 7 ก�รใชค้ำ�สัง่ CASE Statement ในโปรแกรมภ�ษ� PL/SQL:
ตัวอย�่งนี�จะเป็นก�รคำ�นวนท�งคณิตศ�สตร ์ระหว�่งตัวเลข 2 ตัว คือ 55 และ 5 โดยใชค้ำ�สัง่ Case
คำ�สัง่โปรแกรมภ�ษ� PL/SQL:
DECLAREa NUMBER :=55;b NUMBER :=5;arth_operation VARCHAR2(20) :='MULTIPLY';
BEGINdbms_output.put_line('Program started.' );
CASE (arth_operation)WHEN 'ADD' THEN dbms_output.put_line('Addition of
the numbers are: '|| a+b );WHEN 'SUBTRACT' THEN
dbms_output.put_line('Subtraction of the numbers are: '|| a-b );
WHEN 'MULTIPLY' THEN dbms_output.put_line('Multiplication of the numbers are: '|| a*b);
WHEN 'DIVIDE' THEN dbms_output.put_line('Division of the numbers are:'|| a/b);
ELSE dbms_output.put_line('No operation action defined. Invalid operation'); END CASE;dbms_output.put_line('Program completed.' );END;
คำ�สัง่ควบคมุก�รวนซำ�� (Loop Statement) ในโปรแกรมภ�ษ� PL/SQL
คำ�สัง่ควบคมุก�รวนซำ�� (Loop Statement) ใชใ้นก�ร
ควบคมุใหก้�รทำ�ง�นของคำ�สัง่หรอืชุดคำ�สัง่ ชุดใดชุดหน่ึงทำ�ง�น
ต�มจำ�นวนรอบที่กำ�หนดไว ้หรอื ทำ�ซำ��จนกระทั�งเง่ือนไขท่ีควบคมุ
ก�รทำ�ง�นซำ��เปล่ียนแปลงค่� คำ�สัง่ควบคมุก�รวนซำ��ใน PL/SQL จำ�แนกได้ 3 รูปแบบ
คำ�สัง่ Basic Loop คำ�สัง่ FOR Loop คำ�สัง่ WHILE Loop
คำ�สัง่ Basic Loop ในโปรแกรมภ�ษ� PL/SQL
คำ�สัง่ Basic Loop เป็นก�รวนซำ��ไปเรื่อย ๆ ไมม่กีำ�หนด
จนกว�่เง่ือนไขภ�ยใน Loop เป็นจรงิ แล้วค่อยออกจ�ก Loop โครงสร�้งของก�รใชค้ำ�สัง่ควบคมุก�รวนซำ��แบบ Basic Loop เป็น
ดังนี�
รูปแบบท่ี 1 คำ�สัง่ LOOP Statement ในโปรแกรมภ�ษ� PL/SQL:
BEGIN LOOP sequence_of_statements; END LOOP;END;
รูปแบบท่ี 2 คำ�สัง่ LOOP Statement ท่ีม ีEXIT ในโปรแกรมภ�ษ� PL/SQL:
BEGIN LOOP ... EXIT; END LOOP;
END;
รูปแบบท่ี 3 คำ�สัง่ LOOP Statement ท่ีจะ EXIT เมื่อเง่ือนไขท่ีใชใ้นก�รตรวจสอบเป็นจรงิ
BEGIN LOOP ... EXIT WHEN condition; END LOOP;END;
ตัวอย�่งคำ�สัง่ LOOP with EXIT Statement ในโปรแกรมภ�ษ� PL/SQL:
ทำ�ก�รประก�ศตัวแปรชึ�นม� 1 ตัวเพื่อทำ�หน้�ท่ีเป็น counter ภ�ยใน loop จะทำ�ก�รเพิม่ค่�ใหก้ับตัวแปร counter ทีละ 1 ค่� และแสดงค่�ตัวแปร counter ออกม� จ�กนั�นทำ�ก�รตรวจสอบเง่ือนไขว�่ตัวแปร counter ว�่มค่ี�เท่�กับ 5 หรอืไม ่ถ้�เง่ือนไขเป็นจรงิจะออกจ�กคำ�สัง่ก�รวนซำ��
คำ�สัง่โปรแกรมภ�ษ� PL/SQL:DECLARE n_counter NUMBER := 0;BEGIN LOOP n_counter := n_counter + 1; DBMS_OUTPUT.PUT_LINE(n_counter); IF n_counter = 5 THEN EXIT; END IF; END LOOP;
END;
ตัวอย�่งคำ�สัง่ LOOP with EXIT-WHEN Statement ในโปรแกรมภ�ษ� PL/SQL:
เป็นก�รเขยีนโปรแกรมเพื่อแสดงค่�ของตัวแปร counter เชน่เดียวกับตัวอย่�งก่อนหน้� แต่ตัวอย่�งนี�จะไมม่กี�รใชค้ำ�สัง่ if statement เพื่อทำ�ก�รตรวจสอบเง่ือนไขของค่�ตัวแปร counter แต่จะใชค้ำ�สัง่ WHEN และเง่ือนไขในก�รตรวจสอบเพื่อออกจ�กก�รวนซำ�� หลังคำ�สัง่ EXIT
คำ�สัง่โปรแกรมภ�ษ� PL/SQL:
DECLARE n_counter NUMBER := 0;BEGIN LOOP n_counter := n_counter + 1; DBMS_OUTPUT.PUT_LINE(n_counter); EXIT WHEN n_counter = 5; END LOOP;END;
คำ�สัง่ FOR Loop ในโปรแกรมภ�ษ� PL/SQL
คำ�สัง่ FOR Loop เป็นก�รวน Loop ท่ีทร�บจำ�นวนครั�งในก�ร
ทำ�ง�นที่แน่นอน โดย
โครงสร�้งของคำ�สัง่ FOR Loop จะมโีครงสร�้งดังต่อไปนี�
รูปแบบคำ�สัง่ FOR LOOP Statement ในโปรแกรมภ�ษ� PL/SQL:
BEGIN
FOR i IN [REVERSE] lower_bound .. upper_bound LOOP
sequence_of_statements;
END LOOP;
END;
หม�ยเหต ุ:- [REVERSE] ใชส้ำ�หรบัวน loop แบบยอ้นหลัง จ�ก
upper_bound ลดลงทีละ 1 ไปเรื่อยๆ จนถึง lower_bound- ไมต้่องประก�ศตัวแปร index ใหตั้�งชื่อตัวแปรท่ีทำ�หน้�ท่ีเป็น
index ได้เลย และโปรแกรมจะรูจ้กัตัวแปรท่ีเป็น index ภ�ยใน loop เท่�นั�น
ตัวอย�่งคำ�สัง่ FOR LOOP Statement – upward iteration ในโปรแกรมภ�ษ� PL/SQL:
เป็นก�รแสดงค่� 1 ถึง 10 โดยใชค้ำ�สัง่ FOR loop ในก�รแสดงผลลัพธ์
คำ�สัง่โปรแกรมภ�ษ� PL/SQL:
DECLARE n_times NUMBER := 10;BEGIN FOR n_i IN 1..n_times LOOP DBMS_OUTPUT.PUT_LINE(n_i); END LOOP;END;
ตัวอย�่งคำ�สัง่ FOR LOOP Statement – downward iteration ในโปรแกรมภ�ษ� PL/SQL:
ในตัวอย�่งนี� จะมกี�รเรยีกใชค้ำ�สัง่ REVERSE แสดงค่� 10 ถึง 1
คำ�สัง่โปรแกรมภ�ษ� PL/SQL:
DECLARE n_times NUMBER := 10;BEGIN FOR n_i IN REVERSE 1..n_times LOOP DBMS_OUTPUT.PUT_LINE(n_i); END LOOP;END;
คำ�สัง่ WHILE Loop ในโปรแกรมภ�ษ� PL/SQL
เป็นก�รวน Loop ต�มเง่ือนไข โปรแกรมจะทำ�ก�รเชค็เง่ือนไข
ก่อน ตร�บใดท่ีเง่ือนไขได้ผลลัพธเ์ป็น TRUE จะทำ�ง�นต�ม Loop ดังนั�น Loop ชนิดนี�อ�จไมถ่กูทำ�ง�นเลยก็ได้ถ้�ก�รเชค็เง่ือนไขใน
ครั�งแรกไมไ่ด้ผลเป็น TRUE ซึ่งมโีครงสร�้งดังต่อไปนี�
รูปแบบคำ�สัง่ WHILE LOOP Statement ในโปรแกรมภ�ษ� PL/SQL:
DECLARE
counter BEGIN
WHILE condition LOOP
sequence_of_statements;
add counter
END LOOP;
END;
ตัวอย�่งคำ�สัง่ WHILE LOOP Statement ในโปรแกรมภ�ษ� PL/SQL:
ในตัวอย�่งนี� จะเป็นก�รคำ�นวณห�ค่� 10! (Factorial of 10) โดยเรยีกใชค้ำ�สัง่ WHILE LOOP
คำ�สัง่โปรแกรมภ�ษ� PL/SQL:DECLARE n_counter NUMBER := 10; n_factorial NUMBER := 1; n_temp NUMBER;BEGIN n_temp := n_counter; WHILE n_counter > 0 LOOP n_factorial := n_factorial * n_counter; n_counter := n_counter - 1; END LOOP; DBMS_OUTPUT.PUT_LINE('factorial of ' || n_temp || ' is ' || n_factorial);END;
แบบฝึกหัด
ใหนิ้สติเขยีนโปรแกรมแสดงสตูรคณู โดยใหร้บัค่�จ�ก user ว�่ต้องก�รแมส่ตูรคณูใด ซึ่งผลลัพธท์ี่ต้องก�รดังนี�
Input number: 5Multiplication table5x1 = 55x2 = 105x3 = 155x4 = 205x5 = 255x6 = 305x7 = 355x8 = 405x9 = 455x10 = 50
5x11 = 555x12 = 60