Oracle PL/SQL LOOP พร้อมตัวอย่าง

ลูปคืออะไร?

ลูปอนุญาตให้ส่วนหนึ่งของโค้ดในโปรแกรมดำเนินการตามจำนวนครั้งที่ต้องการ

ในบทช่วยสอนนี้ เราจะดูแนวคิดของลูปใน PL/SQL และโฟลว์ของการควบคุมในลูป

รู้เบื้องต้นเกี่ยวกับแนวคิดลูป

แนวคิดของลูปมีข้อดีในการเขียนโค้ดดังต่อไปนี้

  • การนำโค้ดกลับมาใช้ซ้ำได้
  • ขนาดรหัสลดลง
  • การควบคุมที่ง่ายดาย
  • ลดความซับซ้อน

แผนภาพด้านล่างแสดงแนวคิดการวนซ้ำในลักษณะเป็นภาพ

Oracle 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' ในส่วนการดำเนินการ
การใช้ เหมาะสำหรับใช้เมื่อทางออกไม่ได้ขึ้นอยู่กับเงื่อนไขใดๆ