Oracle PL/SQL LOOP พร้อมตัวอย่าง
ลูปคืออะไร?
ลูปอนุญาตให้ส่วนหนึ่งของโค้ดในโปรแกรมดำเนินการตามจำนวนครั้งที่ต้องการ
ในบทช่วยสอนนี้ เราจะดูแนวคิดของลูปใน PL/SQL และโฟลว์ของการควบคุมในลูป
รู้เบื้องต้นเกี่ยวกับแนวคิดลูป
แนวคิดของลูปมีข้อดีในการเขียนโค้ดดังต่อไปนี้
- การนำโค้ดกลับมาใช้ซ้ำได้
- ขนาดรหัสลดลง
- การควบคุมที่ง่ายดาย
- ลดความซับซ้อน
แผนภาพด้านล่างแสดงแนวคิดการวนซ้ำในลักษณะเป็นภาพ
ในแผนภาพด้านบน เงื่อนไขของลูปจะถูกตรวจสอบ และตราบใดที่เงื่อนไขของลูปเป็นไปตามนั้น บล็อกการดำเนินการก็จะถูกดำเนินการ
ในการวนซ้ำแต่ละครั้ง ตัวแปรตัวนับลูปที่ตัดสินใจเงื่อนไขของลูปจริง ๆ ควรปรับเปลี่ยนเพื่อให้การควบคุมออกจากลูป ในบางกรณี ตัวแปรตัวนับลูปนี้เป็นตัวดำเนินการเพิ่ม/ลดสำหรับการนับที่กำหนดไว้ล่วงหน้า และในบางกรณี จะเป็นเงื่อนไขการค้นหาที่ดำเนินการบล็อกต่อไปเรื่อย ๆ จนกว่าจะตรงตามเงื่อนไข
คำสั่งควบคุมลูป
ก่อนที่จะเรียนรู้แนวคิดลูป จำเป็นต้องเรียนรู้คำสั่งควบคุมลูปก่อน คำสั่งควบคุมลูปคือคำสั่งที่ควบคุมโฟลว์ของการดำเนินการภายในลูปจริงๆ ด้านล่างนี้เป็นคำอธิบายโดยละเอียดเกี่ยวกับคำสั่งควบคุมลูป
ดำเนินการต่อ
คีย์เวิร์ดนี้ส่งคำสั่งไปยังกลไก PL/SQL ว่าเมื่อใดก็ตามที่กลไก PL/SQL พบคีย์เวิร์ดนี้ภายในลูป มันจะข้ามโค้ดที่เหลือในบล็อคการทำงานของโค้ด และการวนซ้ำครั้งถัดไปจะเริ่มทันที โดยส่วนใหญ่จะใช้หากต้องการข้ามโค้ดภายในลูปสำหรับค่าการวนซ้ำบางค่า
ออก / ออกเมื่อ
คีย์เวิร์ดนี้ส่งคำสั่งไปยังกลไก PL/SQL ว่าเมื่อใดก็ตามที่กลไก PL/SQL พบคีย์เวิร์ดนี้ มันจะออกจากลูปปัจจุบันทันที หากกลไก PL/SQL พบ EXIT ในลูปที่ซ้อนกัน มันจะออกมาจากลูปที่ถูกกำหนดไว้ เช่น ในลูปที่ซ้อนกัน การให้ EXIT ในลูปด้านในจะเป็นการออกจากการควบคุมจากลูปด้านในเท่านั้น ไม่ใช่จากวงนอก 'EXIT WHEN' ตามด้วยนิพจน์ที่ให้ผลลัพธ์แบบบูลีน หากผลลัพธ์เป็น TRUE ตัวควบคุมจะ EXIT
GOTO
คำสั่งนี้จะโอนการควบคุมไปยังคำสั่งที่มีป้ายกำกับ (“GOTO ;”) ซึ่งมีข้อจำกัดดังต่อไปนี้
- การถ่ายโอนการควบคุมสามารถทำได้ภายในโปรแกรมย่อยเท่านั้น
- ไม่สามารถถ่ายโอนการควบคุมจากส่วนการจัดการข้อยกเว้นไปยังส่วนการดำเนินการได้
ไม่แนะนำให้ใช้คำสั่งนี้ เว้นแต่จะไม่มีทางเลือกอื่น เนื่องจากการตรวจสอบย้อนกลับของการควบคุมโค้ดจะเป็นเรื่องยากมากในโปรแกรม เนื่องจากการถ่ายโอนการควบคุมจากส่วนหนึ่งไปยังอีกส่วนหนึ่ง
ประเภทของลูปใน PL/SQL
PL / SQL มีลูปให้เลือกสามประเภทดังนี้
- คำสั่งวนรอบพื้นฐาน
- สำหรับคำสั่งวนรอบ
- ในขณะที่คำสั่งวนรอบ
คำสั่งวนรอบพื้นฐาน
คำสั่งลูปนี้เป็นโครงสร้างลูปที่ง่ายที่สุดใน 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 จะเป็น INFINITE-LOOP ที่จะไม่มีวันหยุด
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: /
คำอธิบายรหัส:
- รหัสบรรทัดที่ 2: ประกาศตัวแปร 'a' เป็นประเภทข้อมูล 'NUMBER' และเริ่มต้นด้วยค่า '1'
- รหัสบรรทัดที่ 4: พิมพ์ข้อความ “Program beginning”
- รหัสบรรทัด 5: คำหลัก 'LOOP' ถือเป็นจุดเริ่มต้นของการวนซ้ำ
- รหัสบรรทัด 6: พิมพ์ค่าของ 'a'
- รหัสบรรทัด 7: เพิ่มค่าของ 'a' ขึ้น +1
- รหัสบรรทัด 8: ตรวจสอบว่าค่าของ 'a' มากกว่า 5 หรือไม่
- รหัสบรรทัด 9: คำหลัก 'END LOOP' ถือเป็นจุดสิ้นสุดของบล็อกการดำเนินการ
- โค้ดจากบรรทัด 6 ถึงบรรทัด 8 จะดำเนินการต่อไปจนกว่า 'a' จะถึงค่า 6 เนื่องจากเงื่อนไขจะส่งคืน TRUE และตัวควบคุมจะออกจากลูป
- รหัสบรรทัด 10: พิมพ์ข้อความ “โปรแกรมเสร็จสมบูรณ์”
การติดฉลากของลูป
ใน PL/SQL สามารถติดป้ายกำกับลูปได้ ป้ายกำกับควรอยู่ระหว่าง “<<” และ “>>” การติดป้ายลูปโดยเฉพาะในโค้ดลูปแบบซ้อนจะช่วยให้อ่านได้ง่ายขึ้น สามารถกำหนดป้ายกำกับได้ในคำสั่ง EXIT เพื่อออกจากลูปนั้น การใช้ป้ายกำกับ สามารถควบคุมเพื่อออกจากลูปด้านนอกของลูปที่ซ้อนกันจากที่ใดก็ได้ภายในลูปได้โดยตรง โดยให้คำสั่ง exit ตามด้วยเลเบลลูปภายนอก
<<OUTER_LOOP>> LOOP <execution_block_starts> . <<INNER_LOOP>> LOOP --inner <execution_part> END LOOP; . <executi_block_ends> END LOOP;
คำอธิบายไวยากรณ์:
- ในรูปแบบข้างต้น ลูปออกจะมีอีกหนึ่งลูปอยู่ข้างใน
- '< >' และ '< >' คือป้ายกำกับของลูปเหล่านี้
1 ตัวอย่าง:ในตัวอย่างนี้ เราจะพิมพ์ตัวเลขโดยเริ่มจาก 1 โดยใช้คำสั่ง Basic loop ตัวเลขแต่ละตัวจะถูกพิมพ์ออกมาหลายครั้งตามค่าของมัน ขีดจำกัดบนของชุดข้อมูลจะคงที่อยู่ที่ส่วนการประกาศโปรแกรม มาดูกันว่าเราจะใช้แนวคิดของป้ายกำกับเพื่อให้บรรลุสิ่งนี้ได้อย่างไร เพื่อจุดประสงค์นั้น เราจะดำเนินการโค้ดต่อไปนี้
DECLARE a NUMBER:=0; b NUMBER; upper-limit NUMBER :=4; BEGIN dbms_output.put_line(‘Program started.' ); «outerloop» LOOP a:=a+1; b:=l; «inner loop» LOOP EXIT outer_loop WHEN a > upper_limit; dbms_output.put_line(a); b:=b+l; EXIT inner_loop WHEN b>a; END LOOP; END LOOP; dbms_output.put_line('Program completed.'); END; /
คำอธิบายรหัส:
- รหัสบรรทัด 2-3: ประกาศตัวแปร 'a' และ 'b' เป็นประเภทข้อมูล 'NUMBER'
- รหัสบรรทัดที่ 4: ประกาศตัวแปร 'upper_limit' เป็นประเภทข้อมูล 'NUMBER' ที่มีค่า '4'
- รหัสบรรทัดที่ 6: พิมพ์ข้อความ “Program beginning”
- รหัสบรรทัด 7: ลูปด้านนอกมีป้ายกำกับว่า "outer_loop"
- รหัสบรรทัด 9: ค่าของ 'a' จะเพิ่มขึ้น 1
- รหัสบรรทัด 11: วงในมีป้ายกำกับว่า "inner_loop"
- รหัสบรรทัด 13: เงื่อนไข EXIT ที่ตรวจสอบว่าค่า 'a' สูงกว่าค่า 'upper_limit' หรือไม่ ถ้าไม่เช่นนั้นก็จะไปต่อ ไม่เช่นนั้นก็จะออกจากลูปด้านนอกโดยตรง
- รหัสบรรทัด 14: การพิมพ์ค่าของ 'b'
- รหัสบรรทัด 15: เพิ่มค่าของ 'b' ขึ้น +1
- รหัสบรรทัด 16: เงื่อนไข EXIT ที่ตรวจสอบว่าค่าของ 'b' สูงกว่า 'a' หรือไม่ หากเป็นเช่นนั้น มันจะออกจากตัวควบคุมจากลูปด้านใน
- รหัสบรรทัด 14: พิมพ์ข้อความ “โปรแกรมเสร็จสมบูรณ์”
สรุป
ห่วง | ห่วงพื้นฐาน |
เกณฑ์การออก | ออกเมื่อพบคำสำคัญ 'EXIT' ในส่วนการดำเนินการ |
การใช้ | เหมาะสำหรับใช้เมื่อทางออกไม่ได้ขึ้นอยู่กับเงื่อนไขใดๆ |