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

⚡ สรุปอย่างชาญฉลาด

ลูปใน PL/SQL ทำหน้าที่เรียกใช้โค้ดส่วนหนึ่งซ้ำๆ ตามจำนวนครั้งที่ต้องการ PL/SQL มีลูปพื้นฐาน ลูป FOR และลูป WHILE ซึ่งควบคุมด้วยคำสั่ง CONTINUE, EXIT, EXIT WHEN และ GOTO และสามารถกำหนดป้ายกำกับให้กับลูปเพื่อจัดการโครงสร้างแบบซ้อนกันได้อย่างเป็นระเบียบ

  • 🔁 วัตถุประสงค์: ลูปจะเรียกใช้บล็อกโค้ดซ้ำหลายครั้ง ซึ่งช่วยลดขนาดและความซับซ้อนของโค้ด
  • 🧭 ตัวนับรอบ: ตัวแปรนับจะกำหนดเงื่อนไขของลูป และจะต้องเปลี่ยนแปลงเพื่อให้ลูปสามารถสิ้นสุดได้
  • ⏭️ ดำเนินต่อ: ข้ามส่วนที่เหลือของการวนซ้ำปัจจุบันและเริ่มต้นการวนซ้ำครั้งถัดไป
  • 🚪 ทางออก / ออกเมื่อใด: ออกจากลูปทันที โดยอาจทำได้เมื่อเงื่อนไขบูลีนเป็นจริง
  • 🏷️ ป้ายกำกับ: การใช้ป้ายกำกับลูปที่อยู่ระหว่างวงเล็บเหลี่ยมคู่จะช่วยให้คำสั่ง EXIT สามารถกำหนดเป้าหมายไปยังลูปภายนอกได้
  • ♾️ ลูปพื้นฐาน: โปรแกรมจะทำงานไปเรื่อยๆ จนกว่าจะพบคำสั่ง EXIT ที่ระบุไว้อย่างชัดเจน หากไม่มีคำสั่ง EXIT โปรแกรมจะวนลูปไปเรื่อยๆ
  • 🧩 สามประเภท: ลูปพื้นฐาน ลูป FOR และลูป WHILE ครอบคลุมรูปแบบการใช้งานทั่วไป

Oracle ลูป PL/SQL

ลูปคืออะไร?

ลูปช่วยให้สามารถเรียกใช้ส่วนหนึ่งของโค้ดในโปรแกรมได้ตามจำนวนครั้งที่ต้องการ ในบทเรียนนี้ เราจะมาดูแนวคิดของลูปใน PL/SQL และการควบคุมการไหลของโปรแกรมภายในลูป

บทนำเกี่ยวกับแนวคิดของลูป

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

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

แผนภาพด้านล่างแสดงให้เห็นห้องสุขาping แนวคิด.

ห้องน้ำping การไหลของแนวคิดใน PL/SQL

ในแผนภาพด้านบน เงื่อนไขของลูปจะถูกตรวจสอบ และตราบใดที่เงื่อนไขนั้นเป็นจริง บล็อกการทำงานก็จะทำงาน

ในแต่ละรอบการทำงาน ตัวแปรนับลูปที่ใช้ตัดสินเงื่อนไขของลูปควรเปลี่ยนแปลงเพื่อให้โปรแกรมออกจากลูป ในบางกรณี ตัวนับนี้จะเพิ่มหรือลดค่าตามจำนวนที่กำหนดไว้ล่วงหน้า และในบางกรณีจะเป็นเงื่อนไขการค้นหาที่ทำให้โปรแกรมทำงานต่อไปเรื่อยๆ จนกว่าจะตรงตามเงื่อนไข

คำสั่งควบคุมลูป

ก่อนที่จะเรียนรู้แนวคิดเรื่องลูป เราควรเรียนรู้คำสั่งควบคุมลูปเสียก่อน คำสั่งเหล่านี้ใช้ควบคุมการไหลของการทำงานภายในลูป

ดำเนินการต่อ

คีย์เวิร์ดนี้สั่งการให้เอนจิน PL/SQL ข้ามโค้ดส่วนที่เหลือในบล็อกการทำงานและเริ่มการวนซ้ำครั้งถัดไปทันทีเมื่อพบคำว่า CONTINUE ภายในลูป โดยส่วนใหญ่จะใช้เมื่อต้องการข้ามโค้ดภายในลูปสำหรับค่าการวนซ้ำที่กำหนด

ออก / ออกเมื่อ

คีย์เวิร์ดนี้สั่งให้เอนจิน PL/SQL ออกจากลูปปัจจุบันทันที ในลูปซ้อนกัน คำสั่ง EXIT ในลูปด้านในจะออกจากลูปด้านในเท่านั้น ไม่ใช่ลูปด้านนอก 'EXIT WHEN' ตามด้วยนิพจน์ที่ให้ผลลัพธ์เป็นค่าบูลีน หากผลลัพธ์เป็น TRUE การควบคุมจะออกจากลูป

GOTO

คำสั่งนี้จะโอนการควบคุมไปยังคำสั่งที่มีป้ายกำกับ (“GOTO ;”) โดยมีข้อจำกัดดังต่อไปนี้:

  • การถ่ายโอนการควบคุมสามารถทำได้ภายในโปรแกรมย่อยเท่านั้น
  • ไม่สามารถถ่ายโอนการควบคุมจากส่วนการจัดการข้อผิดพลาดไปยังส่วนการดำเนินการได้

ไม่แนะนำให้ใช้ข้อความนี้เว้นแต่ไม่มีทางเลือกอื่น เนื่องจากการควบคุมรหัส tracความสามารถในการใช้งานจะยากมากเมื่อมีการถ่ายโอนการควบคุมจากส่วนหนึ่งไปยังอีกส่วนหนึ่ง

ประเภทของลูปใน PL/SQL

PL / SQL มีลูปสามประเภทดังต่อไปนี้:

ตารางด้านล่างแสดงความแตกต่างระหว่างทั้งสามแบบ ก่อนที่จะอธิบายลูปพื้นฐานโดยละเอียด

ห่วง เกณฑ์การออก เหมาะสำหรับใช้เมื่อ
ลูปพื้นฐาน ระบุ EXIT อย่างชัดเจนในบล็อก ทางออกไม่ได้ขึ้นอยู่กับจำนวนหรือเงื่อนไขที่กำหนดไว้ตายตัว
สำหรับห่วง ตัวนับถึงจุดสิ้นสุดของช่วง จำนวนรอบการทำซ้ำเป็นที่ทราบล่วงหน้า
ลูป WHILE เงื่อนไขกลายเป็นเท็จ ลูปควรทำงานตราบใดที่เงื่อนไขยังคงเป็นจริง

คำสั่งวนรอบพื้นฐาน

นี่คือโครงสร้างลูปที่ง่ายที่สุดใน PL/SQL บล็อกการทำงานเริ่มต้นด้วยคำหลัก 'LOOP' และสิ้นสุดด้วย 'END LOOP' เงื่อนไขการออกจากลูปจะต้องระบุไว้ภายในบล็อกการทำงานเพื่อให้การควบคุมออกจากลูป และต้องระบุคำหลัก EXIT อย่างชัดเจน

โครงสร้างลูปพื้นฐานใน PL/SQL

LOOP
<execution block starts>
<EXIT condition based on developer criteria>
<execution_block_ends>
END LOOP;

คำอธิบายไวยากรณ์:

  • คำว่า 'LOOP' ใช้สำหรับระบุจุดเริ่มต้นของลูป และ 'END LOOP' ใช้สำหรับระบุจุดสิ้นสุดของลูป
  • บล็อกการทำงานประกอบด้วยโค้ดทั้งหมดที่จำเป็นต้องทำงาน รวมถึงเงื่อนไขการออกจากโปรแกรม (EXIT)
  • ส่วนการประมวลผลสามารถประกอบด้วยคำสั่งใดๆ ก็ได้ที่สามารถเรียกใช้งานได้

หมายเหตุ คำสั่งวนลูปพื้นฐานที่ไม่มีคำว่า EXIT จะเป็นการวนลูปไม่รู้จบที่ไม่มีวันสิ้นสุด

1 ตัวอย่าง: ในตัวอย่างนี้ เราจะพิมพ์ตัวเลขตั้งแต่ 1 ถึง 5 โดยใช้คำสั่งวนซ้ำพื้นฐาน

การพิมพ์ตัวเลข 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) เพื่อให้ได้ผลลัพธ์นี้

ตัวอย่างลูปที่มีป้ายกำกับ ส่วนที่ 1ตัวอย่างลูปที่มีป้ายกำกับ ส่วนที่ 2

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: พิมพ์ข้อความ “โปรแกรมเสร็จสมบูรณ์”

คำถามที่พบบ่อย

คำสั่ง EXIT จะออกจากลูปโดยไม่มีเงื่อนไข ส่วนคำสั่ง EXIT WHEN จะออกจากลูปก็ต่อเมื่อนิพจน์บูลีนที่ตามมาเป็นจริงเท่านั้น ซึ่งช่วยลดความจำเป็นในการใช้คำสั่ง IF แยกต่างหากครอบคำสั่ง EXIT ธรรมดา

การใช้ป้ายกำกับช่วยให้คำสั่ง EXIT ในลูปภายในสามารถออกจากลูปภายนอกที่มีชื่อได้ในขั้นตอนเดียว นอกจากนี้ยังทำให้โค้ดที่ซ้อนกันอ่านง่ายขึ้นมากอีกด้วย tracคำสั่ง END LOOP ของ King Plain

หากบล็อกไม่มีคำสั่ง EXIT หรือตัวนับไม่ถึงเงื่อนไข EXIT WHEN ลูปจะไม่หยุดทำงาน ตรวจสอบให้แน่ใจเสมอว่าตัวนับเปลี่ยนทิศทางไปยังเงื่อนไข EXIT WHEN

บ่อยครั้งใช่ AI สามารถทำได้ tracตรวจสอบว่าตัวนับเคลื่อนที่เข้าใกล้เงื่อนไข EXIT หรือไม่ และแจ้งเตือนเมื่อลูปไม่มีทางออกที่เข้าถึงได้ แม้ว่าทางออกที่ขึ้นอยู่กับข้อมูลยังคงต้องมีการทดสอบเพื่อยืนยันก็ตาม

คำสั่ง CONTINUE จะข้ามส่วนที่เหลือของการวนซ้ำในปัจจุบันและกระโดดไปยังการวนซ้ำถัดไป มีประโยชน์เมื่อต้องการละเว้นค่าบางค่าโดยไม่ต้องออกจากลูปทั้งหมด

สรุปโพสต์นี้ด้วย: