ขอบเขตตัวแปร 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 ตัวอย่าง: ในตัวอย่างนี้ เราจะเห็นขอบเขตของตัวแปรในบล็อกด้านในและด้านนอก นอกจากนี้ เราจะดูวิธีอ้างอิงตัวแปรโดยใช้ป้ายกำกับบล็อก
<<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 ตัวอย่าง:ในตัวอย่างนี้ เราจะหาความแตกต่างระหว่างตัวเลขสองตัว โดยตัวหนึ่งประกาศไว้ที่บล็อกด้านนอก และอีกตัวหนึ่งประกาศไว้ที่บล็อกด้านใน ทั้งสองตัวจะมีชื่อเดียวกัน มาดูกันว่าป้ายชื่อบล็อกมีประโยชน์อย่างไรในการอ้างอิงตัวแปรเหล่านี้
<<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' จากบล็อกด้านนอกและด้านใน “ - ” ใช้เพื่ออ้างอิงตัวแปรเหล่านี้เพื่อหลีกเลี่ยงความขัดแย้งเนื่องจากชื่อตัวแปรเดียวกัน
สรุป
ในบทช่วยสอนนี้ เราได้เรียนรู้วิธีสร้างบล็อกที่ซ้อนกัน และวิธีจัดการขอบเขตในบล็อกด้านในและบล็อกด้านนอก เรายังได้เห็นตัวอย่างที่มีการอ้างถึงตัวแปรจากบล็อกด้านในและด้านนอกภายในบล็อกด้านใน