PL/SQL változó hatóköre és belső külső blokk: beágyazott szerkezet

⚡ Okos összefoglaló

A PL/SQL-ben a beágyazott blokkok egy blokkot a másikba helyeznek, lehetővé téve az összetett logika elkülönítését és a kivételkezelés elkülönítését. A külső és belső blokkok közötti változók hatókörének megértése és a blokkcímkék használata egyértelművé teszi az azonos nevű változókat.

  • 🧱 Beágyazott blokk: A beágyazott blokk egy PL/SQL blokk, amely egy másik blokk végrehajtási vagy kivétel szakaszán belül helyezkedik el.
  • ???? Külső és belső: Egy külső, vagy szülő blokk sok belső, vagy gyermek blokkot tartalmazhat, amelyek mindegyike egy teljes PL/SQL blokk.
  • 👁️ Változó hatóköre: A belső blokk előtt deklarált külső blokkváltozók láthatók a blokkon belül, de a belső blokkváltozók nem láthatók azon kívül.
  • 🏷️ Blokkcímkék: A külső blokk címkézése lehetővé teszi, hogy a belső blokk egy azonos nevű külső változóra hivatkozzon, mint a label.variable_name.
  • 🛡️ Kivétel elkülönítése: A beágyazás lehetővé teszi, hogy minden blokk a saját kivételeit kezelje, keeping a hibakezelés a kódhoz közel, amely kiváltja.
  • 🤖 AI segítség: Az olyan mesterséges intelligencia asszisztensek, mint a GitHub Copilot, címkézett beágyazott blokkokat rajzolnak, és jelzik a változó hatókörű ütközéseket.

PL/SQL változók hatóköre beágyazott belső és külső blokkokban

Mi az a beágyazott blokkok Oracle?

In PL / SQL, minden blokk beágyazható egy másik blokkba. Az ilyen blokkot beágyazott blokknak nevezzük. A beágyazott blokkok nagyon gyakoriak, ha egy bizonyos folyamatot végre akarunk hajtani, miközben megtartjuk aping az adott folyamat kódját egy külön konténerben (blokkban).

A beágyazott blokk koncepció segít a programozónak javítani az olvashatóságot azáltal, hogy összetett logikát különálló blokkokra bont, és lehetővé teszi a kivétel hogy minden blokkot a fő külső blokkon belül kezeljenek.

Beágyazott blokkszerkezet

Egy blokk beágyazható egy másik blokkba. Beágyazható a végrehajtási részbe vagy a kivételkezelési részbe, és ezek a blokkok címkézhetők is. Egy külső blokk sok belső blokkot tartalmazhat. Minden belső blokk önmagában is egy PL/SQL blokk, tehát a belső blokk összes tulajdonsága és jellemzője megegyezik a külső blokkéval. A szülőblokk a fő blokk, a gyermekblokk pedig a beágyazott blokk.

Az alábbi kép a beágyazott blokkszerkezet képi ábrázolását mutatja, amelyben a szülőblokk a fő blokk, a gyermekblokk pedig a beágyazott blokk.

Egy PL/SQL beágyazott blokk képi ábrázolása egy szülő külső blokkal és egy gyermek belső blokkal

Az alábbiakban a beágyazott blokk szintaxisa látható. Az alábbi képernyőkép a beágyazott blokk szintaxisát mutatja a címkézett külső és belső blokkokkal.

Beágyazott blokk szintaxis, amely felcímkézett külső és belső blokkokat jelenít meg, mindegyik DECLARE, BEGIN és EXCEPTION szakaszokkal

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 egy beágyazott blokkot mutat be, amely összesen két blokkot tartalmaz.
  • Ezeket a blokkokat „külső_blokk” és „belső_blokk” címkékkel láttuk el.

Hatókör a beágyazott blokkban: Változó hatókör

Egy beágyazott blokkban minden blokk használata előtt világosan meg kell érteni azok hatókörét és láthatóságát. Különösen a belső blokkban láthatók mind a külső, mind a belső blokk elemei, ezért ennek megfelelő megértése szükséges.

Az alábbi pontok összefoglalják a beágyazott blokkokban található hatóköröket.

  • A külső blokkban deklarált elemek, valamint a belső blokk definíciója előtt definiált érték látható a belső blokkon belül.
  • 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ő és a belső blokk lehet egy változó ugyanazzal a névvel.
  • Azonos nevű változók esetén a belső blokk alapértelmezés szerint csak a belső blokkban deklarált változóra hivatkozik.
  • Ha a belső blokk a belső blokkváltozó nevével megegyező nevű külső blokkváltozóra akar hivatkozni, akkor a külső blokkot CÍMKÉZNEK kell lennie, és a külső blokkváltozóra úgy lehet hivatkozni, mint ' . '.

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 belső és külső blokkban található változók hatókörét látjuk. Azt is látjuk, hogyan lehet a változókra blokkcímke használatával hivatkozni.

Az alábbi képernyőkép az 1. példát mutatja, ahol a belső blokk egy külső blokkváltozóra hivatkozik a blokkcímke használatával.

Példa beágyazott blokkokban lévő változók hatókörére, amelyek egy külső blokkváltozóra hivatkoznak a blokkcímkéjükkel

<<OUTER_BLOCK>>
DECLARE
var1 VARCHAR2(30):='outer_block';
var2 VARCHAR2(30):='value before inner block';
BEGIN
<<INNER_BLOCK>>
DECLARE
var1 VARCHAR2(30):='inner_block';
BEGIN
dbms_output.put_line(var1);
dbms_output.put_line(OUTER_BLOCK.var1); 
dbms_output.put_line(var2);
END;
var2:='value after inner block';
END;
/

Code Magyarázat:

  • Code 1. sor: A külső blokk „KÜLSŐ_BLOKK” címkézése.
  • Code 3. sor: A 'var1' változó deklarálása VARCHAR2(30) változóként, a kezdeti érték „outer_block”.
  • Code 4. sor: Egy 'var2' változó deklarálása VARCHAR2(30)-ként, amelynek kezdeti értéke „érték a belső blokk előtt”.
  • Code 6. sor: A belső blokk „INNER_BLOCK” címkével való ellátása.
  • Code 8. sor: A belső blokkban található 'var1' változó VARCHAR2(30) változóként való deklarálása „inner_block” kezdeti értékkel.
  • Code 10. sor: A 'var1' értékének kinyomtatása. Mivel nincs megadva címke, alapértelmezés szerint a belső blokkból veszi az értéket, ezért a 'inner_block' üzenetet nyomtatja ki.
  • Code 11. sor: A külső blokkváltozó, a 'var1' értékének kinyomtatása. Mivel a belső blokknak is van egy azonos nevű változója, a külső blokk címkéjére hivatkozunk. Így a 'outer_block' üzenetet nyomtatja ki.
  • Code 12. sor: A külső blokkváltozó, 'var2' értékének kinyomtatása. Mivel a belső blokkban nincs ilyen nevű változó, alapértelmezés szerint a külső blokkból veszi az értéket, ezért a 'belső blokk előtti érték' üzenetet nyomtatja ki.
  • A külső blokkban található „var2” változóhoz a „belső blokk utáni érték” érték van rendelve. Ez az értékadás azonban a belső blokk definíciója után történik, így ez az érték nincs jelen a belső blokkon belül.

Példa 2: Ebben a példában két szám közötti különbséget keressük, az egyik a külső blokkban, a másik a belső blokkban van deklarálva. Mindkettőnek ugyanaz a neve. Nézzük meg, hogyan hasznos a blokkcímke ezekre a változókra való hivatkozásban.

Az alábbi képernyőkép a 2. példát mutatja, amely kiszámítja az azonos nevű külső és belső blokkváltozók közötti különbséget.

Példa azonos nevű külső és belső blokkváltozók közötti különbség kiszámítására blokkcímkék használatával

<<OUTER_BLOCK>>
DECLARE 
ln_val NUMBER :=5;
BEGIN
<<INNER_BLOCK>>
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;
/

Code Magyarázat:

  • Code 1. sor: A külső blokk „KÜLSŐ_BLOKK” címkézése.
  • Code 3. sor: Az 'ln_val' változó deklarálása NUMBER formátumban, „5” kezdőértékkel.
  • Code 5. sor: A belső blokk „INNER_BLOCK” címkével való ellátása.
  • Code 7. sor: Az 'ln_val' változó deklarálása a belső blokkban NUMBER formátumban, „3” kezdeti értékkel.
  • Code 9. sor: Kinyomtatja az 'ln_val' értékének különbségét a külső és belső blokkból. A „ . A „” formátumot használják ezekre a változókra való hivatkozásra, hogy elkerüljék az azonos változónevekből adódó ütközéseket.

GYIK

A beágyazott blokk egy másik blokkon belül elhelyezett névtelen blokk, amely ott fut, ahol megjelenik. alprogram (eljárás vagy függvény) egy elnevezett, újrafelhasználható egység, amelyet külön tárolnak és név szerint hívnak meg, opcionálisan paraméterekkel.

Minden blokknak lehet saját EXCEPTION szakasza. A belső blokkban keletkezett kivételt először az a blokk kezeli; ha nem kezelik, akkor a körülvevő külső blokk kezelőjéhez továbbítódik. Ez lehetővé teszi a hibakezelés blokkonkénti elkülönítését.

A PL/SQL nem szab meg apró, fix korlátot, így a blokkok több szint mélyen is beágyazhatók. A gyakorlatban a mély beágyazás rontja az olvashatóságot, ezért a legtöbb kód két vagy három szinten ágyazza be a blokkokat, és az újrafelhasználható logikát alprogramokba helyezi át.

A blokkcímke, amelyet dupla csúcsos zárójelben, a DECLARE előtt írunk, egy blokkot nevez meg. A címkék lehetővé teszik a belső kód számára, hogy egy külső változót label.variable_name-ként minősítsen, és GOTO célként is szolgálhatnak, így a beágyazott kód könnyebben olvasható és dokumentálható.

Igen. Egy beágyazott blokk bárhol megjelenhet, ahol egy végrehajtható utasítás megengedett, beleértve egy ciklust, egy IF ágat vagy egy eljárás törzsét. Ez lehetővé teszi a deklarációk és a kivételkezelés hatókörének kiterjesztését a kódnak csak arra a részére, ahol szükség van rájuk.

A beágyazás elsősorban egy fordítási idejű strukturáló eszköz, és önmagában nem ad jelentős futási idejű többletterhelést. Javítja az olvashatóságot és a hibák izolálását. A túlzottan mély beágyazás inkább a karbantarthatóságot, mint a nyers sebességet károsítja.

Igen. GitHub másodpilóta külső és belső blokkokkal címkézett vázlatokat készít egy megjegyzésből, beleértve a DECLARE, BEGIN és EXCEPTION szakaszokat is. RevTekintse meg a blokkcímkéket és a változók hatókörét, hogy az azonos nevű belső és külső változók a kívánt módon oldódjanak fel.

A mesterséges intelligencia asszisztensek elemzik a beágyazott blokkokat, és megjelölik az árnyékolt változókat, a nem minősített hivatkozásokat és a hatókörön kívüli hozzáféréseket. Ez a gépi tanuláson alapuló áttekintés kiemeli azokat a helyeket, ahol egy belső blokk csendben, a kód futtatása előtt rossz, azonos nevű változót használ.

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