ขอบเขตตัวแปร PL/SQL และบล็อกด้านนอกด้านใน: โครงสร้างที่ซ้อนกัน

Nested Blocks คืออะไร Oracle?

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

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

โครงสร้างบล็อกที่ซ้อนกัน

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

โครงสร้างบล็อกที่ซ้อนกัน

ด้านล่างนี้คือไวยากรณ์สำหรับบล็อกที่ซ้อนกัน

โครงสร้างบล็อกที่ซ้อนกัน

ไวยากรณ์บล็อกที่ซ้อนกัน

<<outer_block>>
DECLARE
 <Declarative section> 
BEGIN
 <Execution part for outer block begins>

 <<inner block>>
 DECLARE
  <Declarative section>
 BEGIN
  <Execution part for inner block>.
 EXCEPTION 
  <Exception handling part>
 END;

 <Execution part for outer block begins> 
EXCEPTION 
<Exception handling part>
END;
  • ไวยากรณ์ข้างต้นแสดงบล็อกที่ซ้อนกันซึ่งมีทั้งหมดสองบล็อก
  • บล็อกเหล่านี้มีป้ายกำกับว่า 'outer_block' และ 'inner_block'

ขอบเขตในบล็อกที่ซ้อนกัน: ขอบเขตตัวแปร

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

ด้านล่างนี้จะสรุปรายละเอียดเพิ่มเติมเกี่ยวกับขอบเขตในบล็อกที่ซ้อนกัน

  • องค์ประกอบที่ประกาศในบล็อกด้านนอกและค่าที่กำหนดไว้ก่อนที่คำจำกัดความของบล็อกด้านในจะมองเห็นได้ภายในบล็อกด้านใน
  • องค์ประกอบที่ประกาศในบล็อกด้านในไม่สามารถมองเห็นได้ในบล็อกด้านนอก มองเห็นได้เฉพาะภายในบล็อกด้านในเท่านั้น
  • บล็อกด้านนอกและบล็อกด้านในสามารถมีตัวแปรที่มีชื่อเดียวกันได้
  • ในกรณีของตัวแปรที่มีชื่อเดียวกัน บล็อกภายในโดยค่าเริ่มต้นจะอ้างอิงถึงตัวแปรที่ประกาศในบล็อกภายในเท่านั้น
  • หากบล็อกด้านในต้องการอ้างอิงตัวแปรบล็อกภายนอกที่มีชื่อเดียวกับบล็อกด้านใน บล็อกด้านนอกควรเป็น LABELLED และตัวแปรบล็อกภายนอกสามารถอ้างอิงเป็น ' - -

ตัวอย่างด้านล่างจะช่วยให้เข้าใจเพิ่มเติมเกี่ยวกับขอบเขตเหล่านี้

1 ตัวอย่าง: ในตัวอย่างนี้ เราจะเห็นขอบเขตของตัวแปรในบล็อกด้านในและด้านนอก นอกจากนี้ เราจะดูวิธีอ้างอิงตัวแปรโดยใช้ป้ายกำกับบล็อก

ขอบเขตใน Nested Block

<<OUTER_BLOC>>
DECLARE
varl VARCHAR2(30):='outer_block';
var2 VARCHAR2(30):='value before inner block’;
BEGIN
<<NNER_BLOCK>>
DECLARE
varl VARCHAR2(30):='inner_block';
BEGIN
dbms_output.put_line(varl), ‭	‬
dbms_output.put_line(OUTER_BLOCKvar1); 
dbms_output.put_line(var2);
END;
var2:='value after inner block';
END;
/

คำอธิบายรหัส:

  • รหัสบรรทัดที่ 1: ติดป้ายกำกับบล็อกด้านนอกว่า “OUTER_BLOCK”
  • รหัสบรรทัดที่ 3: ประกาศตัวแปร 'var1' เป็น VARCHAR2 (30) ด้วยค่าเริ่มต้นเป็น “outer block”
  • รหัสบรรทัดที่ 4: ประกาศตัวแปร 'var2' เป็น VARCHAR2 (30) ด้วยค่าเริ่มต้นเป็น “value before inside block”
  • รหัสบรรทัด 6: การติดป้ายกำกับบล็อกด้านในเป็น “INNER_BLOCK”
  • รหัสบรรทัด 8: การประกาศตัวแปร 'var1' ในบล็อกด้านในเป็น VARCHAR2 (30) โดยมีค่าเริ่มต้นเป็น "บล็อกด้านใน"
  • รหัสบรรทัด 10: การพิมพ์ค่าของ 'var1' เนื่องจากไม่มีการกล่าวถึงป้ายกำกับโดยค่าเริ่มต้น จึงต้องรับค่าจากบล็อกด้านใน ดังนั้นจึงพิมพ์ข้อความ 'inner_block'
  • รหัสบรรทัด 11: การพิมพ์ค่าของตัวแปรบล็อกภายนอก 'var1' เนื่องจากบล็อกด้านในมีตัวแปรที่มีชื่อเหมือนกัน เราจึงต้องอ้างอิงถึงป้ายกำกับบล็อกด้านนอก จึงพิมพ์ข้อความ 'outer block'
  • รหัสบรรทัด 12: การพิมพ์ค่าของตัวแปรบล็อกภายนอก 'var2' เนื่องจากไม่มีตัวแปรที่มีชื่อนี้อยู่ในบล็อกด้านใน โดยค่าเริ่มต้นแล้ว จะใช้ค่าจากบล็อกด้านนอก ดังนั้นจะพิมพ์ข้อความ 'ค่าก่อนบล็อกด้านใน'
  • ตัวแปร 'var2' ในบล็อกด้านนอกได้รับการกำหนดด้วยค่า 'ค่าหลังบล็อกด้านใน' แต่การมอบหมายนี้เกิดขึ้นหลังจากคำจำกัดความของบล็อกภายใน ดังนั้นค่านี้จึงไม่ปรากฏในบล็อกด้านใน

2 ตัวอย่าง:ในตัวอย่างนี้ เราจะหาความแตกต่างระหว่างตัวเลขสองตัว โดยตัวหนึ่งประกาศไว้ที่บล็อกด้านนอก และอีกตัวหนึ่งประกาศไว้ที่บล็อกด้านใน ทั้งสองตัวจะมีชื่อเดียวกัน มาดูกันว่าป้ายชื่อบล็อกมีประโยชน์อย่างไรในการอ้างอิงตัวแปรเหล่านี้

ขอบเขตใน Nested Block

<<OUTER_BLOC>>
DECLARE 
ln_val NUMBER :=5;
BEGIN
<<INNERBLOC>>
DECLARE 
ln_val NUMBER :=3;
BEGIN
dbms_output.put_line(The difference between outer block and inner block variable is:'||' outer_block. ln_val-inner_block.ln_val);
END;
END;
/

คำอธิบายรหัส:

  • รหัสบรรทัดที่ 1: ติดป้ายกำกับบล็อกด้านนอกว่า “OUTER_BLOCK”
  • รหัสบรรทัดที่ 3: ประกาศตัวแปร 'ln_val' เป็น NUMBER โดยมีค่าเริ่มต้นเป็น “5”
  • รหัสบรรทัด 5: การติดป้ายกำกับบล็อกด้านในเป็น “INNER_BLOCK”
  • รหัสบรรทัด 7: ประกาศตัวแปร 'ln_val' ในบล็อกด้านในเป็น NUMBER โดยมีค่าเริ่มต้นเป็น "3"
  • รหัสบรรทัด 9: การพิมพ์ความแตกต่างในค่า 'ln_val' จากบล็อกด้านนอกและด้านใน “ - ” ใช้เพื่ออ้างอิงตัวแปรเหล่านี้เพื่อหลีกเลี่ยงความขัดแย้งเนื่องจากชื่อตัวแปรเดียวกัน

สรุป

ในบทช่วยสอนนี้ เราได้เรียนรู้วิธีสร้างบล็อกที่ซ้อนกัน และวิธีจัดการขอบเขตในบล็อกด้านในและบล็อกด้านนอก เรายังได้เห็นตัวอย่างที่มีการอ้างถึงตัวแปรจากบล็อกด้านในและด้านนอกภายในบล็อกด้านใน