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.

Beágyazott blokkszerkezet

Alább látható a beágyazott blokk szintaxisa.

Beágyazott blokkszerkezet

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.

Hatókör a beágyazott blokkban

<<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.

Hatókör a beágyazott blokkban

<<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.

Foglald össze ezt a bejegyzést a következőképpen: