Oracle คำสั่ง PL/SQL IF THEN ELSE: ELSIF, NESTED-IF
คำชี้แจงการตัดสินใจคืออะไร?
แถลงการณ์การตัดสินใจคือผู้ที่จะตัดสินใจควบคุมการไหลของ SQL งบตามเงื่อนไข ช่วยให้โปรแกรมเมอร์ควบคุมได้ดีขึ้นในการป้องกันโค้ดเฉพาะจากการรัน (แผนภาพที่ 1) หรือเลือกโค้ดที่ต้องการตามเงื่อนไข (แผนภาพที่ 2) ด้านล่างนี้คือภาพประกอบของ “คำชี้แจงการตัดสินใจ”

ประเภทของคำชี้แจงการตัดสินใจ:
Oracle ให้คำชี้แจงการตัดสินใจประเภทต่อไปนี้
- ถ้า - แล้ว
- ถ้า-แล้ว-อย่างอื่น
- ถ้า-แล้ว-ELSIF
- ซ้อน-IF
- กรณี
- กรณีที่ถูกค้นหา
คำสั่ง IF-THEN
คำสั่ง IF-THEN ส่วนใหญ่จะใช้เพื่อรันโค้ดบางส่วนเมื่อตรงตามเงื่อนไขเท่านั้น
สภาพควรจะให้ผล บูลีน (จริง/เท็จ) เป็นคำสั่งเงื่อนไขพื้นฐานที่จะอนุญาตให้ ORACLE ดำเนินการ/ข้ามโค้ดบางส่วนตามเงื่อนไขที่กำหนดไว้ล่วงหน้า
ไวยากรณ์สำหรับคำสั่ง IF THEN:
IF <condition: returns Boolean> THEN -executed only if the condition returns TRUE <action_block> END if;
- ในรูปแบบข้างต้น คำหลัก 'IF' จะตามมาด้วยเงื่อนไขที่ประเมินเป็น 'TRUE'/'FALSE'
- การควบคุมจะดำเนินการ เฉพาะในกรณีที่เงื่อนไขกลับมา -
- ในกรณีที่มีการประเมินสภาพถึง จากนั้น SQL จะข้ามไฟล์ และจะเริ่มรันโค้ดถัดจากบล็อก 'END IF'
หมายเหตุ เมื่อใดก็ตามที่ประเมินเงื่อนไขเป็น 'NULL' แล้ว SQL จะถือว่า 'NULL' เป็น 'FALSE'
1 ตัวอย่าง:ในตัวอย่างนี้ เราจะพิมพ์ข้อความเมื่อตัวเลขมากกว่า 100 โดยเราจะดำเนินการโค้ดต่อไปนี้
หากต้องการพิมพ์ข้อความเมื่อตัวเลขมีค่ามากกว่า 100 เราต้องรันโค้ดต่อไปนี้
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: ประกาศตัวแปร 'a' เป็นประเภทข้อมูล 'NUMBER' และเริ่มต้นด้วยค่า '10'
- บรรทัดรหัส 4: การพิมพ์คำสั่ง "เริ่มต้นโปรแกรม"
- รหัสบรรทัด 5: การตรวจสอบเงื่อนไขว่าตัวแปร 'a' มากกว่า '100' หรือไม่
- บรรทัดรหัส 6: หาก 'a' มากกว่า '100' ระบบจะพิมพ์ “a มากกว่า 100” หาก 'a' น้อยกว่าหรือเท่ากับ 100 แสดงว่าเงื่อนไขล้มเหลว ดังนั้นคำสั่งการพิมพ์ด้านบนจึงถูกละเว้น
- บรรทัดโค้ด 8: การพิมพ์ข้อความ "Program complete"
รหัสเอาท์พุท:
Program started. Program completed.
2 ตัวอย่าง: ในตัวอย่างนี้ เราจะพิมพ์ข้อความหากมีตัวอักษรที่ระบุอยู่ในสระภาษาอังกฤษ (A, E, I, O, U)
หากต้องการพิมพ์ข้อความเมื่ออักขระที่กำหนดเป็นสระ ให้รันโค้ดดังต่อไปนี้
DECLARE a CHAR(1) :=’u’; BEGIN IF UPPER(a) in ('A’,'E','I','0','U' ) THEN dbms_output.put_line(‘The character is in English Vowels'); END IF; END; /
คำอธิบายรหัส:
- รหัสบรรทัด 2: ประกาศตัวแปร 'a' เป็น 'CHAR' ของประเภทข้อมูลขนาด '1' และเริ่มต้นด้วยค่า 'u'
- รหัสบรรทัด 4: การตรวจสอบเงื่อนไขว่ามีตัวแปร 'a' อยู่ในรายการหรือไม่ ('A', 'E', 'I', 'O', 'U')
- ค่าของ 'a' ถูกแปลงเป็นตัวพิมพ์ใหญ่ก่อนที่จะเปรียบเทียบเพื่อให้การเปรียบเทียบไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่
- รหัสบรรทัด 5: หากมี 'a' อยู่ในรายการ ข้อความ “The character is in English Vowels” จะถูกพิมพ์ออกมา หากเงื่อนไขล้มเหลว โปรแกรมนี้จะไม่ให้ผลลัพธ์ใดๆ เนื่องจากนอกบล็อก IF-THEN เรายังไม่ได้ออกคำสั่งการพิมพ์ใดๆ
รหัสเอาท์พุท:
The character is in English Vowels
คำสั่ง IF-THEN-ELSE
- คำสั่ง IF-THEN-ELSE ส่วนใหญ่จะใช้ในการเลือกระหว่างสองทางเลือกตามเงื่อนไข
- ด้านล่างนี้คือการแสดงไวยากรณ์ของคำสั่ง IF-THEN-ELSE
ไวยากรณ์สำหรับคำสั่ง IF-THEN-ELSE:
IF <condition: returns Boolean> THEN -executed only if the condition returns TRUE <action_blockl> ELSE -execute if the condition failed (returns FALSE) <action_block2> END if;
- ในรูปแบบข้างต้น คำหลัก 'IF' จะตามมาด้วยเงื่อนไขที่ประเมินเป็น 'TRUE'/'FALSE'
- การควบคุมจะดำเนินการ เฉพาะในกรณีที่เงื่อนไขกลับมา -
- ในกรณีที่มีการประเมินสภาพถึง จากนั้น SQL จะดำเนินการ -
- ไม่ว่าในกรณีใด จะมีการดำเนินการหนึ่งในสองบล็อกการดำเนินการ
หมายเหตุ เมื่อใดก็ตามที่เงื่อนไขประเมินเป็น 'NULL' ดังนั้น SQL จะถือว่า 'NULL' เป็น 'FALSE'
1 ตัวอย่าง: ในตัวอย่างนี้ เราจะพิมพ์ข้อความว่าตัวเลขที่กำหนดเป็นเลขคี่หรือเลขคู่
DECLARE a NUMBER:=11; BEGIN dbms_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 number1); END IF; dbms_output.put_line (‘Program completed.’); END; /
คำอธิบายรหัส:
- รหัสบรรทัด 2: ประกาศตัวแปร 'a' เป็นประเภทข้อมูล 'NUMBER' และเริ่มต้นด้วยค่า '11'
- บรรทัดรหัส 4: การพิมพ์คำสั่ง "เริ่มต้นโปรแกรม"
- บรรทัดโค้ด 5: การตรวจสอบเงื่อนไขว่าโมดูลัสของตัวแปร 'a' คูณ '2' เป็น 0 หรือไม่
- รหัสบรรทัด 6: หาก '0' ระบบจะพิมพ์ "a เป็นเลขคู่"
- รหัสบรรทัด 7: หากค่าโมดูลัสไม่เท่ากับ '0' เงื่อนไขก็จะส่งคืน จึงจะพิมพ์ข้อความ “a เป็นเลขคี่”
- รหัสบรรทัดที่ 10: การพิมพ์คำสั่ง “โปรแกรมเสร็จสมบูรณ์”
รหัสเอาท์พุท:
Program started. a is odd number Program completed.
คำสั่ง IF-THEN-ELSIF
- คำสั่ง IF-THEN-ELSIF ส่วนใหญ่จะใช้ในกรณีที่ควรเลือกทางเลือกหนึ่งจากชุดทางเลือก โดยที่แต่ละทางเลือกมีเงื่อนไขของตัวเองที่จะต้องปฏิบัติตาม
- เงื่อนไขแรกที่ส่งคืน จะถูกดำเนินการ และเงื่อนไขที่เหลือจะถูกข้ามไป
- คำสั่ง IF-THEN-ELSIF อาจมีบล็อก 'ELSE' อยู่ในนั้น บล็อก 'ELSE' นี้จะถูกดำเนินการหากไม่มีเงื่อนไขใดที่ตรงตามเงื่อนไข
หมายเหตุ: บล็อก ELSE เป็นทางเลือกในคำสั่งแบบมีเงื่อนไขนี้ หากไม่มีบล็อก ELSE และไม่มีเงื่อนไขใดที่ตรงตามความต้องการ คอนโทรลเลอร์จะข้ามบล็อกการดำเนินการทั้งหมดและเริ่มดำเนินการโค้ดส่วนที่เหลือ
ไวยากรณ์สำหรับคำสั่ง IF-THEN-ELSIF:
IF <conditionl: returns Boolean> THEN -executed only if the condition returns TRUE < action_blockl> ELSIF <condition2 returns Boolean> < action_block2> ELSIF <condition3:returns Boolean> < action_block3> ELSE —optional <action_block_else> END if;
- ในรูปแบบข้างต้น ตัวควบคุมจะดำเนินการ เฉพาะในกรณีที่เงื่อนไข 1 ส่งคืน -
- หากเงื่อนไข 1 ไม่เป็นไปตามนั้น คอนโทรลเลอร์จะตรวจสอบเงื่อนไข 2
- ตัวควบคุมจะออกจากคำสั่ง IF ในสองกรณีต่อไปนี้
- เมื่อผู้ควบคุมพบเงื่อนไขใด ๆ ที่ส่งคืน - ในกรณีนี้ action_block ที่เกี่ยวข้องจะถูกดำเนินการ และตัวควบคุมจะออกจากบล็อกคำสั่ง IF นี้ และจะเริ่มดำเนินการโค้ดที่เหลือ
- เมื่อไม่ตรงตามเงื่อนไขใดๆ ตัวควบคุมจะดำเนินการบล็อก ELSE หากมีอยู่ จากนั้นจะออกจากคำสั่ง IF
หมายเหตุ เมื่อใดก็ตามที่เงื่อนไขประเมินเป็น 'NULL' ดังนั้น SQL จะถือว่า 'NULL' เป็น 'FALSE'
1 ตัวอย่าง: ไม่มีบล็อก ELSE
ในตัวอย่างนี้ เราจะพิมพ์เกรดตามเครื่องหมายที่กำหนดโดยไม่มีเงื่อนไขอื่น (เครื่องหมาย >= 70 เกรด A, เครื่องหมาย >=40 และเครื่องหมาย <70 เกรด B, เครื่องหมาย >=35 และเครื่องหมาย <40 เกรด C)
DECLARE mark NUMBER :=55; BEGIN dbms_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; /
คำอธิบายรหัส:
- รหัสบรรทัด 2: ประกาศตัวแปร 'ทำเครื่องหมาย' เป็นประเภทข้อมูล 'NUMBER' และเริ่มต้นด้วยค่า '55'
- บรรทัดรหัส 4: การพิมพ์คำสั่ง "เริ่มต้นโปรแกรม"
- บรรทัดรหัส 5: การตรวจสอบเงื่อนไข 1 ว่า 'เครื่องหมาย' มากกว่าหรือเท่ากับ 70
- รหัสบรรทัด 7: เนื่องจากเงื่อนไข 1 ล้มเหลว ดังนั้นเงื่อนไข 2 '70>เครื่องหมาย>=40′ จะถูกตรวจสอบ
- รหัสบรรทัด 8: เงื่อนไข 2 ส่งคืน ดังนั้นข้อความ 'เกรด B' จะถูกพิมพ์ออกมา
- รหัสบรรทัดที่ 12: การพิมพ์คำสั่ง "โปรแกรมเสร็จสมบูรณ์"
- ในกรณีนี้ เงื่อนไข 3 'เครื่องหมาย < 35' จะถูกข้ามไป เนื่องจากตัวควบคุมพบเงื่อนไขหนึ่งที่ส่งคืน ก่อนเงื่อนไขที่ 3
รหัสเอาท์พุท:
Program started. Grade B Program completed.
2 ตัวอย่าง: มีบล็อก ELSE
ในตัวอย่างนี้ เราจะพิมพ์เกรดตามเครื่องหมายที่กำหนดโดยมีเงื่อนไข else (เครื่องหมาย >= 70 เกรด A, เครื่องหมาย >=40 และเครื่องหมาย <70 เกรด B, เครื่องหมาย >=35 และเครื่องหมาย <40 เกรด C, อย่างอื่น 'ไม่มีเกรด')
DECLARE mark NUMBER :=25; BEGIN dbms_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; /
คำอธิบายรหัส:
- รหัสบรรทัด 2: ประกาศตัวแปร 'ทำเครื่องหมาย' เป็นประเภทข้อมูล 'NUMBER' และเริ่มต้นด้วยค่า '25'
- บรรทัดรหัส 4: การพิมพ์คำสั่ง "เริ่มต้นโปรแกรม"
- รหัสบรรทัด 5: ตรวจสอบเงื่อนไข 1 ว่า 'เครื่องหมาย' มากกว่าหรือเท่ากับ 70
- รหัสบรรทัด 7: เนื่องจากเงื่อนไข 1 ล้มเหลว ดังนั้นเงื่อนไข 2 '70>เครื่องหมาย>=40′ จะถูกตรวจสอบ
- รหัสบรรทัด 8: เนื่องจากเงื่อนไข 2 ล้มเหลว ดังนั้นเงื่อนไข 3 '40>เครื่องหมาย>=35′ จะถูกตรวจสอบ
- รหัสบรรทัด 11: เนื่องจากเงื่อนไขทั้งหมดล้มเหลว การควบคุมจะตรวจสอบการมีอยู่ของบล็อก ELSE และจะพิมพ์ข้อความ 'ไม่มีเกรด' จากบล็อก ELSE
- รหัสบรรทัดที่ 14: การพิมพ์คำสั่ง "โปรแกรมเสร็จสมบูรณ์"
รหัสเอาท์พุท:
Program started. No Grade Program completed.
คำสั่ง NESTED-IF
- โดยทั่วไปแล้ว คำสั่ง NESTED-IF อนุญาตให้โปรแกรมเมอร์วางเงื่อนไข 'IF' อย่างน้อยหนึ่งเงื่อนไขภายในเงื่อนไข 'IF' อื่น นอกเหนือจากข้อความปกติ
- เงื่อนไข 'IF' แต่ละเงื่อนไขควรมีคำสั่ง 'END IF' แยกต่างหากซึ่งถือเป็นการสิ้นสุดขอบเขตของเงื่อนไขนั้น -
- คำสั่ง 'IF' จะพิจารณาคำสั่ง 'END IF' ที่ใกล้ที่สุดเป็นจุดสิ้นสุดสำหรับเงื่อนไขนั้นโดยเฉพาะ
- การแสดงรูปภาพสำหรับ NESTED-IF แสดงอยู่ด้านล่างแผนภาพ
IF <conditionl: returns Boolean> THEN —executed only if the condition returns TRUE <action block1 starts> IF <condition2: returns Boolean> THEN <action_block2> END IF; —END IF corresponds to condition2 <action_blockl ends> END IF; —END IF corresponds to condition1
คำอธิบายไวยากรณ์:
- ในรูปแบบข้างต้น IF ภายนอกจะมีคำสั่ง IF มากกว่าหนึ่งคำสั่งในบล็อกการดำเนินการ
- เงื่อนไข 1 ส่งคืน จากนั้นการควบคุมจะดำเนินการ และตรวจสอบสภาพ1.
- หากเงื่อนไข 2 ส่งคืนเช่นกัน , แล้ว จะถูกดำเนินการด้วย
- ในกรณีที่เงื่อนไข 2 ประเมินเป็น จากนั้น SQL จะข้ามไฟล์ -
เราจะมาดูตัวอย่างของ Nested If –
ตัวอย่างของคำสั่ง Nested- If: Greatest of three number
ในตัวอย่างนี้ เราจะพิมพ์ตัวเลขที่มากที่สุดจากสามตัวโดยใช้คำสั่ง Nested-If ตัวเลขจะถูกกำหนดไว้ในส่วนการประกาศ ดังที่คุณเห็นในโค้ดด้านล่าง นั่นคือ Number= 10,15, 20 และ XNUMX และตัวเลขสูงสุดจะถูกดึงออกมาโดยใช้คำสั่ง nested-if
DECLARE a NUMBER :=10; b NUMBER :=15; c NUMBER :=20; BEGIN dbms_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_line(’B is greatest' ); ELSE dbms_output.put_line(’C is greatest' ); END IF; END IF; dbms_output.put_line(‘Program completed.’ ); END; /
คำอธิบายรหัส:
- รหัสบรรทัด 2: ประกาศตัวแปร 'a' เป็นประเภทข้อมูล 'NUMBER' และเริ่มต้นด้วยค่า '10'
- รหัสบรรทัด 3: ประกาศตัวแปร 'b' เป็นประเภทข้อมูล 'NUMBER' และเริ่มต้นด้วยค่า '15'
- บรรทัดโค้ด 4: ประกาศตัวแปร 'c' เป็นประเภทข้อมูล 'NUMBER' และเริ่มต้นด้วยค่า '20'
- รหัสบรรทัดที่ 6: การพิมพ์ข้อความ “เริ่มต้นโปรแกรม” (บรรทัดที่ 6)
- รหัสบรรทัด 7: ตรวจสอบเงื่อนไข 1 ว่า 'a' มากกว่า 'b' (บรรทัด 7)
- บรรทัดโค้ด 10: หาก 'a' มากกว่า 'b ดังนั้นเงื่อนไขใน 'nested-if 1' จะตรวจสอบว่า 'a' มากกว่า 'c' (บรรทัด 10)
- รหัสบรรทัด 13: หากยังคงเป็น 'a' มากกว่า ข้อความ 'A ยิ่งใหญ่ที่สุด' จะถูกพิมพ์ (บรรทัด 11) มิฉะนั้นหากเงื่อนไข 2 ล้มเหลว ระบบจะพิมพ์ 'C มากที่สุด' (บรรทัดที่ 13)
- รหัสบรรทัด 18: ในกรณีที่เงื่อนไข 1 ส่งกลับค่าเท็จ เงื่อนไขใน 'nested-if 2' จะตรวจสอบว่า 'b' มากกว่า 'c' (บรรทัด 18)
- บรรทัดโค้ด 21: หาก 'b' มากกว่า 'c' ข้อความ 'B ยิ่งใหญ่ที่สุด' จะถูกพิมพ์ (บรรทัด 19) มิฉะนั้นหากเงื่อนไข 2 ล้มเหลว 'C ยิ่งใหญ่ที่สุด' จะถูกพิมพ์ (บรรทัด 21)
- รหัสบรรทัด 24: การพิมพ์ข้อความ “โปรแกรมเสร็จสมบูรณ์” (บรรทัด 24)
ผลลัพธ์ของรหัส:
Program started. Checking Nested-IF 2 C is greatest Program completed.
สรุป
ในบทนี้ เราได้เรียนรู้ข้อความเพื่อการตัดสินใจต่างๆ ตลอดจนไวยากรณ์และตัวอย่าง ตารางด้านล่างนี้ให้ข้อมูลสรุปของข้อความสั่งแบบมีเงื่อนไขต่างๆ ที่เราได้พูดคุยกัน
ประเภท | DESCRIPTION | การใช้ |
---|---|---|
ถ้า - แล้ว | ตรวจสอบเงื่อนไขบูลีน หากโค้ด TRUE ในบล็อก 'THEN' จะถูกดำเนินการ | หากต้องการข้าม/รันโค้ดเฉพาะตามเงื่อนไข |
ถ้า-แล้ว-อย่างอื่น | ตรวจสอบเงื่อนไขบูลีน หากโค้ด TRUE ในบล็อก 'THEN' จะถูกดำเนินการ หากโค้ดเท็จในบล็อก 'ELSE' ถูกดำเนินการ | เหมาะสมที่สุดในสภาพ 'นี้หรือนั่น' |
ถ้า-แล้ว-ELSIF | ตรวจสอบเงื่อนไขบูลีนตามลำดับ บล็อกแรกในลำดับที่ส่งคืนเงื่อนไข TRUE จะถูกดำเนินการ หากไม่มีเงื่อนไขใดในลำดับที่เป็น TRUE โค้ดในบล็อก 'ELSE' จะถูกดำเนินการ | เคยเลือกมากกว่าสองทางเลือกเป็นส่วนใหญ่ |
ซ้อน-IF | อนุญาตหนึ่งหรือหลายคำสั่ง IF-THEN หรือ IF-THEN-ELSIF ภายในคำสั่ง IF-THEN หรือ IF-THEN-ELSIF อื่น | ส่วนใหญ่ใช้ในสถานการณ์ที่มีสภาพซ้อนกัน |