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

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

Oracle ลูป FOR ใน PL/SQL จะรันบล็อกโค้ดซ้ำตามจำนวนครั้งที่กำหนดระหว่างค่าต่ำสุดและค่าสูงสุด ตัวแปรลูปถูกประกาศโดยปริยายและเพิ่มค่าเองโดยอัตโนมัติ จึงไม่จำเป็นต้องกำหนดตัวนับด้วยตนเอง และคำหลัก REVERSE จะทำให้ลูปนับถอยหลัง

  • 🔢 ดีที่สุดสำหรับ: ลูป FOR เหมาะสำหรับกรณีที่ทราบจำนวนรอบการวนซ้ำที่แน่นอน มากกว่าเงื่อนไขที่ไม่มีกำหนดเวลาสิ้นสุด
  • 📏 Range: ขีดจำกัดล่างและขีดจำกัดบนจะกำหนดจำนวนครั้งที่ลูปทำงาน
  • ⚙️ ตัวนับโดยนัย: ตัวแปรลูปจะถูกประกาศโดยอัตโนมัติและเพิ่มค่าขึ้นเองโดยอัตโนมัติ
  • 🎯 ขอบเขต: ตัวแปรลูปจะมีอยู่เฉพาะภายในลูปเท่านั้น
  • 🔄 ย้อนกลับ: การเพิ่มคำว่า REVERSE ก่อนค่าขีดจำกัดล่างจะทำให้การนับถอยหลังของลูปทำงาน
  • 🪜 ซ้อนกัน: ลูปสามารถซ้อนกันได้ และลูปด้านในจะทำงานจนเสร็จสมบูรณ์ในแต่ละรอบของลูปด้านนอก
  • 🚪 ออกอัตโนมัติ: ลูปจะสิ้นสุดโดยอัตโนมัติเมื่อตัวแปรอยู่นอกช่วงที่กำหนด

Oracle ลูป For ใน PL/SQL

ลูป FOR คืออะไร?

คำสั่ง “FOR LOOP” เหมาะที่สุดเมื่อคุณต้องการเรียกใช้โค้ดตามจำนวนครั้งที่กำหนด ไม่ใช่ขึ้นอยู่กับเงื่อนไขอื่น ๆ

ในลูปนี้ จะมีการระบุค่าต่ำสุดและค่าสูงสุด และตราบใดที่ตัวแปรในลูปอยู่ระหว่างช่วงที่กำหนด ลูปก็จะทำงาน

ตัวแปรวนซ้ำจะเพิ่มค่าขึ้นเองโดยอัตโนมัติ ดังนั้นจึงไม่จำเป็นต้องเพิ่มค่าอย่างชัดเจน ตัวแปรวนซ้ำไม่จำเป็นต้องประกาศ เนื่องจากมีการประกาศโดยปริยายอยู่แล้ว

FOR <loop_variable> in <lower_limit> .. <higher_limit>
LOOP
<execution block starts>
.
.
.
<execution_block_ends>
END LOOP;

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

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

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

ลูป FOR พิมพ์ตัวเลข 1 ถึง 5

BEGIN
dbms_output.put_line('Program started.');
FOR a IN 1 .. 5
LOOP
dbms_output.put_line(a);
END LOOP;
dbms_output.put_line('Program completed.');
END;
/

Code คำอธิบาย:

  • Code สาย 2: แสดงข้อความ “โปรแกรมเริ่มต้นแล้ว”
  • Code สาย 3: คำว่า 'FOR' เป็นคำที่ใช้กำหนดจุดเริ่มต้นของลูป และมีการประกาศตัวแปรลูป 'a' ซึ่งมีค่าตั้งแต่ 1 ถึง 5
  • Code สาย 5: พิมพ์ค่าของ 'a'
  • Code สาย 6: คำหลัก 'END LOOP' ใช้เพื่อระบุจุดสิ้นสุดของบล็อกการทำงาน
  • บรรทัดที่ 5 จะทำงานต่อไปจนกว่าค่า 'a' จะถึง 6 ซึ่ง ณ จุดนั้นเงื่อนไขจะล้มเหลวและโปรแกรมจะออกจากลูป
  • Code สาย 7: พิมพ์ข้อความ “โปรแกรมเสร็จสมบูรณ์”

ลูปซ้อน

คำสั่งลูปสามารถซ้อนกันได้ โดยลูปภายนอกและลูปภายในอาจมีประเภทต่างกัน ในลูปซ้อนกัน ในแต่ละรอบของการทำงานของลูปภายนอก ลูปภายในจะทำงานจนเสร็จสมบูรณ์

โครงสร้างลูปซ้อนกัน

LOOP --outer
<execution block starts>
LOOP --inner
<execution_part>
END LOOP;
<execution_block_ends>
END LOOP;

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

  • ห่วงด้านนอกมีห่วงอีกห่วงหนึ่งอยู่ด้านใน
  • ลูปสามารถเป็นประเภทใดก็ได้ และฟังก์ชันการทำงานจะเหมือนกัน

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

ตัวอย่างการใช้ลูป FOR ซ้อนกัน ส่วนที่ 1

ตัวอย่างการใช้ลูป FOR ซ้อนกัน ส่วนที่ 2

DECLARE
b NUMBER;
BEGIN
dbms_output.put_line('Program started');
FOR a IN 1..3
LOOP
b:= 1;
WHILE (a>=b)
LOOP
dbms_output.put_line(a);
b:= b+1;
END LOOP;
END LOOP;
dbms_output.put_line('Program completed');
END;
/

Code คำอธิบาย:

  • Code สาย 2: กำหนดชนิดข้อมูลให้กับตัวแปร 'b' เป็น 'NUMBER'
  • Code สาย 4: แสดงข้อความ “โปรแกรมเริ่มต้นแล้ว”
  • Code สาย 5: คำว่า 'FOR' เป็นคำที่ใช้กำหนดจุดเริ่มต้นของลูป และมีการประกาศตัวแปรลูป 'a' ซึ่งมีค่าตั้งแต่ 1 ถึง 3
  • Code สาย 7: รีเซ็ตค่า 'b' เป็น '1' ในแต่ละครั้ง
  • Code สาย 8: ด้านใน ในขณะที่วนซ้ำ ตรวจสอบเงื่อนไข a>=b
  • Code สาย 10: พิมพ์ค่า 'a' ตราบใดที่เป็นไปตามเงื่อนไขข้างต้น
  • Code สาย 14: พิมพ์ข้อความ “โปรแกรมเสร็จสมบูรณ์”

ลูป FOR และลูป FOR ย้อนกลับ

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

ฟอร์ม ส่วนหัว ลำดับของค่า
น้อยไปหามาก สำหรับ IN 1 .. 5 1, 2, 3, 4, 5
มากไปหาน้อย สำหรับแบบย้อนกลับ 1 .. 5 5, 4, 3, 2, 1

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

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

ไม่ ลูป FOR ประกาศตัวแปรโดยปริยาย และตัวแปรนั้นจะมีอยู่เฉพาะภายในลูปเท่านั้น การประกาศตัวแปรชื่อเดียวกันภายนอกลูปจะไม่ส่งผลกระทบต่อตัวแปรที่ใช้ในลูป

คำสั่ง REVERSE จะทำให้ลูปทำงานวนซ้ำจากค่าขีดจำกัดบนลงไปยังค่าขีดจำกัดล่าง ค่าขีดจำกัดยังคงเขียนจากต่ำไปสูง เพียงแต่ลำดับการเข้าถึงค่าจะกลับกัน

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

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

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

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