Oracle PL/SQL LOOP พร้อมตัวอย่าง
⚡ สรุปอย่างชาญฉลาด
ลูปใน PL/SQL ทำหน้าที่เรียกใช้โค้ดส่วนหนึ่งซ้ำๆ ตามจำนวนครั้งที่ต้องการ PL/SQL มีลูปพื้นฐาน ลูป FOR และลูป WHILE ซึ่งควบคุมด้วยคำสั่ง CONTINUE, EXIT, EXIT WHEN และ GOTO และสามารถกำหนดป้ายกำกับให้กับลูปเพื่อจัดการโครงสร้างแบบซ้อนกันได้อย่างเป็นระเบียบ
ลูปคืออะไร?
ลูปช่วยให้สามารถเรียกใช้ส่วนหนึ่งของโค้ดในโปรแกรมได้ตามจำนวนครั้งที่ต้องการ ในบทเรียนนี้ เราจะมาดูแนวคิดของลูปใน PL/SQL และการควบคุมการไหลของโปรแกรมภายในลูป
บทนำเกี่ยวกับแนวคิดของลูป
แนวคิดเรื่องลูปมีข้อดีดังต่อไปนี้ในการเขียนโค้ด:
- การนำโค้ดกลับมาใช้ซ้ำได้
- ลดขนาดโค้ดลง
- ควบคุมการทำงานได้ง่ายและสะดวก
- ลดความซับซ้อนลง
แผนภาพด้านล่างแสดงให้เห็นห้องสุขาping แนวคิด.
ในแผนภาพด้านบน เงื่อนไขของลูปจะถูกตรวจสอบ และตราบใดที่เงื่อนไขนั้นเป็นจริง บล็อกการทำงานก็จะทำงาน
ในแต่ละรอบการทำงาน ตัวแปรนับลูปที่ใช้ตัดสินเงื่อนไขของลูปควรเปลี่ยนแปลงเพื่อให้โปรแกรมออกจากลูป ในบางกรณี ตัวนับนี้จะเพิ่มหรือลดค่าตามจำนวนที่กำหนดไว้ล่วงหน้า และในบางกรณีจะเป็นเงื่อนไขการค้นหาที่ทำให้โปรแกรมทำงานต่อไปเรื่อยๆ จนกว่าจะตรงตามเงื่อนไข
คำสั่งควบคุมลูป
ก่อนที่จะเรียนรู้แนวคิดเรื่องลูป เราควรเรียนรู้คำสั่งควบคุมลูปเสียก่อน คำสั่งเหล่านี้ใช้ควบคุมการไหลของการทำงานภายในลูป
ดำเนินการต่อ
คีย์เวิร์ดนี้สั่งการให้เอนจิน PL/SQL ข้ามโค้ดส่วนที่เหลือในบล็อกการทำงานและเริ่มการวนซ้ำครั้งถัดไปทันทีเมื่อพบคำว่า CONTINUE ภายในลูป โดยส่วนใหญ่จะใช้เมื่อต้องการข้ามโค้ดภายในลูปสำหรับค่าการวนซ้ำที่กำหนด
ออก / ออกเมื่อ
คีย์เวิร์ดนี้สั่งให้เอนจิน PL/SQL ออกจากลูปปัจจุบันทันที ในลูปซ้อนกัน คำสั่ง EXIT ในลูปด้านในจะออกจากลูปด้านในเท่านั้น ไม่ใช่ลูปด้านนอก 'EXIT WHEN' ตามด้วยนิพจน์ที่ให้ผลลัพธ์เป็นค่าบูลีน หากผลลัพธ์เป็น TRUE การควบคุมจะออกจากลูป
GOTO
คำสั่งนี้จะโอนการควบคุมไปยังคำสั่งที่มีป้ายกำกับ (“GOTO ;”) โดยมีข้อจำกัดดังต่อไปนี้:
- การถ่ายโอนการควบคุมสามารถทำได้ภายในโปรแกรมย่อยเท่านั้น
- ไม่สามารถถ่ายโอนการควบคุมจากส่วนการจัดการข้อผิดพลาดไปยังส่วนการดำเนินการได้
ไม่แนะนำให้ใช้ข้อความนี้เว้นแต่ไม่มีทางเลือกอื่น เนื่องจากการควบคุมรหัส tracความสามารถในการใช้งานจะยากมากเมื่อมีการถ่ายโอนการควบคุมจากส่วนหนึ่งไปยังอีกส่วนหนึ่ง
ประเภทของลูปใน PL/SQL
PL / SQL มีลูปสามประเภทดังต่อไปนี้:
- คำสั่งวนรอบพื้นฐาน
- สำหรับคำสั่งวนรอบ
- ในขณะที่คำสั่งวนรอบ
ตารางด้านล่างแสดงความแตกต่างระหว่างทั้งสามแบบ ก่อนที่จะอธิบายลูปพื้นฐานโดยละเอียด
| ห่วง | เกณฑ์การออก | เหมาะสำหรับใช้เมื่อ |
|---|---|---|
| ลูปพื้นฐาน | ระบุ EXIT อย่างชัดเจนในบล็อก | ทางออกไม่ได้ขึ้นอยู่กับจำนวนหรือเงื่อนไขที่กำหนดไว้ตายตัว |
| สำหรับห่วง | ตัวนับถึงจุดสิ้นสุดของช่วง | จำนวนรอบการทำซ้ำเป็นที่ทราบล่วงหน้า |
| ลูป WHILE | เงื่อนไขกลายเป็นเท็จ | ลูปควรทำงานตราบใดที่เงื่อนไขยังคงเป็นจริง |
คำสั่งวนรอบพื้นฐาน
นี่คือโครงสร้างลูปที่ง่ายที่สุดใน PL/SQL บล็อกการทำงานเริ่มต้นด้วยคำหลัก 'LOOP' และสิ้นสุดด้วย 'END LOOP' เงื่อนไขการออกจากลูปจะต้องระบุไว้ภายในบล็อกการทำงานเพื่อให้การควบคุมออกจากลูป และต้องระบุคำหลัก EXIT อย่างชัดเจน
LOOP <execution block starts> <EXIT condition based on developer criteria> <execution_block_ends> END LOOP;
คำอธิบายไวยากรณ์:
- คำว่า 'LOOP' ใช้สำหรับระบุจุดเริ่มต้นของลูป และ 'END LOOP' ใช้สำหรับระบุจุดสิ้นสุดของลูป
- บล็อกการทำงานประกอบด้วยโค้ดทั้งหมดที่จำเป็นต้องทำงาน รวมถึงเงื่อนไขการออกจากโปรแกรม (EXIT)
- ส่วนการประมวลผลสามารถประกอบด้วยคำสั่งใดๆ ก็ได้ที่สามารถเรียกใช้งานได้
หมายเหตุ คำสั่งวนลูปพื้นฐานที่ไม่มีคำว่า EXIT จะเป็นการวนลูปไม่รู้จบที่ไม่มีวันสิ้นสุด
1 ตัวอย่าง: ในตัวอย่างนี้ เราจะพิมพ์ตัวเลขตั้งแต่ 1 ถึง 5 โดยใช้คำสั่งวนซ้ำพื้นฐาน
DECLARE a NUMBER:= 1; BEGIN dbms_output.put_line('Program started.'); LOOP dbms_output.put_line(a); a:= a+1; EXIT WHEN a>5; END LOOP; dbms_output.put_line('Program completed'); END; /
Code คำอธิบาย:
- Code สาย 2: ประกาศตัวแปร 'a' เป็นชนิด 'NUMBER' และกำหนดค่าเริ่มต้นเป็น '1'
- Code สาย 4: แสดงข้อความ “โปรแกรมเริ่มต้นแล้ว”
- Code สาย 5: คำว่า 'LOOP' เป็นคำที่ใช้ระบุจุดเริ่มต้นของลูป
- Code สาย 6: พิมพ์ค่าของ 'a'
- Code สาย 7: เพิ่มค่าของ 'a' ขึ้น 1
- Code สาย 8: ตรวจสอบว่าค่าของ 'a' มากกว่า 5 หรือไม่
- Code สาย 9: คำหลัก 'END LOOP' ใช้เพื่อระบุจุดสิ้นสุดของบล็อกการทำงาน
- บรรทัดที่ 6 ถึง 8 จะทำงานต่อไปจนกว่าค่า 'a' จะถึง 6 ซึ่ง ณ จุดนั้นเงื่อนไขจะส่งคืนค่า TRUE และการควบคุมจะออกจากลูป
- Code สาย 10: พิมพ์ข้อความ “โปรแกรมเสร็จสมบูรณ์”
การติดฉลากของลูป
ใน PL/SQL สามารถกำหนดป้ายกำกับให้กับลูปได้ โดยป้ายกำกับควรอยู่ระหว่าง “<<” และ “>>” การกำหนดป้ายกำกับให้กับลูป โดยเฉพาะอย่างยิ่งในลูปซ้อนกัน จะช่วยให้การอ่านง่ายขึ้น ป้ายกำกับสามารถใส่ไว้ในคำสั่ง EXIT เพื่อออกจากลูปนั้นๆ ได้ ดังนั้นการควบคุมจึงสามารถออกจากลูปภายนอกของโครงสร้างที่ซ้อนกันได้โดยตรงโดยการใช้คำสั่ง EXIT ตามด้วยป้ายกำกับของลูปภายนอก
<<OUTER_LOOP>> LOOP <execution_block_starts> . <<INNER_LOOP>> LOOP --inner <execution_part> END LOOP; . <execution_block_ends> END LOOP;
คำอธิบายไวยากรณ์:
- ห่วงด้านนอกมีห่วงอีกห่วงหนึ่งอยู่ด้านใน
- '< >' และ '< เครื่องหมาย >' คือป้ายกำกับของลูปเหล่านี้
1 ตัวอย่าง: ในตัวอย่างนี้ เราจะพิมพ์ตัวเลขเริ่มต้นจาก 1 โดยใช้คำสั่งวนซ้ำพื้นฐาน ตัวเลขแต่ละตัวจะถูกพิมพ์ซ้ำตามจำนวนครั้งเท่ากับค่าของมัน ขีดจำกัดบนของชุดตัวเลขถูกกำหนดไว้แล้วในส่วนของการประกาศตัวแปร เราใช้แนวคิดเรื่องป้ายกำกับ (label) เพื่อให้ได้ผลลัพธ์นี้
DECLARE a NUMBER:= 0; b NUMBER; upper_limit NUMBER := 4; BEGIN dbms_output.put_line('Program started.'); <<outer_loop>> LOOP a:= a+1; b:= 1; <<inner_loop>> LOOP EXIT outer_loop WHEN a > upper_limit; dbms_output.put_line(a); b:= b+1; EXIT inner_loop WHEN b>a; END LOOP; END LOOP; dbms_output.put_line('Program completed.'); END; /
Code คำอธิบาย:
- Code บรรทัดที่ 2-3: กำหนดตัวแปร 'a' และ 'b' เป็นชนิดข้อมูล 'NUMBER'
- Code สาย 4: กำหนดตัวแปร 'upper_limit' เป็นชนิด 'NUMBER' และกำหนดค่าเป็น '4'
- Code สาย 6: แสดงข้อความ “โปรแกรมเริ่มต้นแล้ว”
- Code สาย 7: ลูปภายนอกมีชื่อว่า “outer_loop”
- Code สาย 9: ค่าของ 'a' จะเพิ่มขึ้น 1
- Code สาย 11: ลูปด้านในมีชื่อว่า “inner_loop”
- Code สาย 13: เงื่อนไขการออกจากลูป (EXIT) ที่ตรวจสอบว่าค่า 'a' สูงกว่าค่า 'upper_limit' หรือไม่ ถ้าไม่ใช่ ก็จะดำเนินการต่อ แต่ถ้ามากกว่า ก็จะออกจากลูปภายนอกโดยตรง
- Code สาย 14: การพิมพ์ค่าของ 'b'
- Code สาย 15: เพิ่มค่าของ 'b' ขึ้น 1
- Code สาย 16: เงื่อนไข EXIT ที่ตรวจสอบว่า 'b' สูงกว่า 'a' หรือไม่ ถ้าใช่ ก็จะออกจากลูปภายใน
- Code สาย 19: พิมพ์ข้อความ “โปรแกรมเสร็จสมบูรณ์”







