PL/SQL változó hatóköre és belső külső blokk: beágyazott szerkezet
Mi az a beágyazott blokkok Oracle?
PL/SQL-ben minden blokk beágyazható egy másik blokkba. Beágyazott blokknak nevezik őket. A beágyazott blokkok nagyon gyakoriak, amikor az adott folyamatot szeretnénk végrehajtani, ugyanakkor ezeknek a folyamatoknak a kódját külön tárolóban (blokkban) kell tartani.
A beágyazott blokk koncepció segít a programozónak az olvashatóság javításában azáltal, hogy az összetett dolgokat minden blokkba szétválasztja, és kezeli a kivételeket minden egyes blokk esetében a fő külső blokkon belül.
Beágyazott blokkszerkezet
Egy blokk beágyazható egy másik blokkba. Ez beágyazható a végrehajtási részbe vagy a kivétel kezelése rész. Ezek a blokkok címkézhetők is. Egy külső blokk több belső blokkot is tartalmazhat. Minden belső blokk még egyszer a PL/SQL blokk, ezért a belső blokk összes tulajdonsága és jellemzője megegyezik a külső blokk tulajdonságaival. Az alábbi képen látható a beágyazott blokkstruktúra képi ábrázolása. A szülőblokk a fő, a gyermekblokk pedig a beágyazott blokk.
Alább látható a beágyazott blokk szintaxisa.
Beágyazott blokk szintaxis
<<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;
- A fenti szintaxis azt a beágyazott blokkot mutatja, amely összesen két blokkot tartalmaz.
- Ezek a blokkok 'outer_block' és 'inner_block' címkével vannak ellátva
Hatókör a beágyazott blokkban: Változó hatókör
A beágyazott blokkban tisztán kell érteni az egyes blokkok hatókörét és láthatóságát, mielőtt használnák őket. Különösen a belső blokkban láthatóak lesznek mind a külső, mind a belső blokk elemei, ezért ennek megfelelő megértése szükséges.
Az alábbiakban összefoglaljuk a beágyazott blokkokban található hatóköröket.
- A külső blokkban deklarált elemek és a belső blokkdefiníció előtt meghatározott érték a belső blokkon belül láthatók.
- A belső blokkban deklarált elemek nem láthatók a külső blokkban. Csak a belső blokkon belül láthatók.
- A külső blokk és a belső blokk azonos nevű változóval rendelkezhet.
- Azonos nevű változók esetén a belső blokk alapértelmezés szerint csak a belső blokkban deklarált változóra fog hivatkozni.
- Ha a belső blokk arra a külső blokkváltozóra szeretne hivatkozni, amelynek neve megegyezik a belső blokk névvel, akkor a külső blokkot CÍMKÉZNI kell, és a külső blokkváltozót "" . '
Az alábbi példa segít jobban megérteni ezeket a hatóköröket.
Példa 1: Ebben a példában a változók hatókörét fogjuk látni a belső és a külső blokkban. Azt is látni fogjuk, hogyan hivatkozhatunk a változókra a blokkcímke használatával.
<<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; /
Kód magyarázata:
- 1. kódsor: A külső blokk „OUTER_BLOCK” címkézése.
- 3. kódsor: 'var1' változó deklarálása VARCHAR2-ként (30) a "külső blokk" kezdeti értékével.
- 4. kódsor: 'var2' változó deklarálása VARCHAR2-ként (30) az "érték a belső blokk előtt" kezdeti értékkel.
- 6. kódsor: A belső blokk „INNER_BLOCK” címkézése
- 8. kódsor: Egy „var1” változó deklarálása a belső blokkban VARCHAR2-ként (30) az „inner block” kezdeti értékkel.
- 10. kódsor: 'var1' értékének nyomtatása. Mivel alapértelmezés szerint nincs megemlítve címke, az értéket egy belső blokkból veszi, így kinyomtatja az „inner_block” üzenetet.
- 11. kódsor: A 'var1' külső blokkváltozó értékének nyomtatása. Mivel a belső blokk azonos nevű változót tartalmaz, a külső blokkcímkére kell hivatkoznunk. Így kinyomtatva a „külső blokk” üzenetet.
- 12. kódsor: A 'var2' külső blokkváltozó értékének nyomtatása. Mivel a belső blokkban nincs ilyen nevű változó, alapértelmezés szerint egy külső blokkból veszi át az értéket, így kinyomtatja az "érték a belső blokk előtt" üzenetet.
- A külső blokkban lévő 'var2' változóhoz az 'value after inner block' értéke van hozzárendelve. De ez a hozzárendelés egy belső blokk meghatározása után történt. Ezért ez az érték nem szerepel a belső blokkban.
Példa 2: Ebben a példában meg fogjuk találni a különbséget két szám között, amelyek közül az egyik a külső, a másik pedig a belső blokkban van deklarálva. Mindkettőnek ugyanaz lesz a neve. Nézzük meg, hogyan hasznos a blokkcímke ezekre a változókra hivatkozva.
<<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; /
Kód magyarázata:
- 1. kódsor: A külső blokk „OUTER_BLOCK” címkézése.
- 3. kódsor: Az 'ln_val' változó SZÁMként való deklarálása „5” kezdeti értékkel.
- 5. kódsor: A belső blokk „INNER_BLOCK” címkézése
- 7. kódsor: A belső blokkban lévő 'ln_val' változó SZÁMként való deklarálása „3” kezdeti értékkel.
- 9. kódsor: Az 'ln_val' érték különbségének kinyomtatása a külső és a belső blokkból. A " . ” formátumot használunk ezekre a változókra az azonos változónév miatti ütközések elkerülése érdekében.
Összegzésként
Ebben az oktatóanyagban megtanultuk, hogyan lehet beágyazott blokkot létrehozni, és hogyan kell kezelni a hatókört a belső és a külső blokkokban. Láttunk olyan példát is, amikor a belső és a külső blokk változóira a belső blokkon belül hivatkoztak.




