PL/SQL variabel bereik en binnenste buitenblok: geneste structuur

Wat zijn geneste blokken Oracle?

In PL/SQL kan elk blok in een ander blok worden genest. Ze worden een genest blok genoemd. Geneste blokken zijn heel gebruikelijk wanneer we een bepaald proces willen uitvoeren, en tegelijkertijd moet de code voor dit proces in een aparte container (blok) worden bewaard.

Het geneste blokconcept helpt de programmeur de leesbaarheid te verbeteren door de complexe elementen in elk blok te scheiden en de uitzondering voor elk blok in het hoofdbuitenblok af te handelen.

Geneste blokstructuur

Een blok kan in een ander blok worden genest. Dit kan worden genest in het uitvoeringsgedeelte of in het afhandeling van uitzonderingen deel. Deze blokken kunnen ook worden gelabeld. Eén buitenblok kan meerdere binnenblokken bevatten. Elk binnenblok is opnieuw een PL/SQL-blokDaarom zullen alle eigenschappen en kenmerken van het binnenblok hetzelfde zijn als die van het buitenblok. De onderstaande afbeelding geeft de grafische weergave van de geneste blokstructuur. Het bovenliggende blok is het hoofdblok en het onderliggende blok is het geneste blok.

Geneste blokstructuur

Hieronder vindt u de syntaxis voor het geneste blok.

Geneste blokstructuur

Geneste bloksyntaxis

<<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;
  • De bovenstaande syntaxis toont het geneste blok dat in totaal twee blokken bevat.
  • Deze blokken worden gelabeld als 'outer_block' en 'inner_block'

Bereik in genest blok: Variabel bereik

Bij genest blokken moet men de reikwijdte en zichtbaarheid van elk blok duidelijk begrijpen voordat u het kunt gebruiken. Met name in het binnenblok zullen de elementen uit zowel het buiten- als het binnenblok zichtbaar zijn. Een goed begrip hiervan is dan ook noodzakelijk.

Hieronder vindt u een samenvatting van de scopes in geneste blokken.

  • De elementen die zijn gedeclareerd in het buitenste blok en de waarde die is gedefinieerd vóór de definitie van het binnenste blok, zijn zichtbaar in het binnenste blok.
  • De elementen die in het binnenblok zijn gedeclareerd, zijn niet zichtbaar in het buitenblok. Ze zijn alleen zichtbaar binnen het binnenblok.
  • Buitenblok en binnenblok kunnen een variabele met dezelfde naam hebben.
  • In het geval van variabelen met dezelfde naam zal het binnenste blok standaard alleen verwijzen naar de variabele die in het binnenste blok is gedeclareerd.
  • Als het binnenste blok wil verwijzen naar de buitenste blokvariabele die dezelfde naam heeft als die van het binnenste blok, dan moet het buitenste blok LABELLED zijn en kan naar de buitenste blokvariabele worden verwezen als ' . '

Het onderstaande voorbeeld helpt u meer over deze bereiken te begrijpen.

Voorbeeld 1: In dit voorbeeld gaan we de reikwijdte van variabelen in het binnenste en buitenste blok bekijken. We gaan ook zien hoe we naar de variabelen kunnen verwijzen met behulp van bloklabels.

Bereiken in genest blok

<<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;
/

Code Verklaring:

  • Coderegel 1: Het buitenste blok labelen als "OUTER_BLOCK".
  • Coderegel 3: Een variabele 'var1' declareren als VARCHAR2 (30) met de initiële waarde van “outer block”.
  • Coderegel 4: Een variabele 'var2' declareren als VARCHAR2 (30) met de initiële waarde van "waarde vóór binnenblok".
  • Coderegel 6: Het binnenste blok labelen als "INNER_BLOCK"
  • Coderegel 8: Een variabele 'var1' in het binnenste blok declareren als VARCHAR2 (30) met de initiële waarde van “binnenste blok”.
  • Coderegel 10: De waarde van 'var1' afdrukken. Omdat er standaard geen label wordt vermeld, zal het de waarde van een binnenblok overnemen, waardoor het bericht 'inner_block' wordt afgedrukt.
  • Coderegel 11: Afdrukken van de waarde van de buitenste blokvariabele 'var1'. Omdat het binnenste blok de variabele met dezelfde naam heeft, moeten we verwijzen naar het buitenste bloklabel. Zo wordt de boodschap 'buitenblok' afgedrukt.
  • Coderegel 12: Afdrukken van de waarde van de buitenste blokvariabele 'var2'. Omdat er geen variabele met deze naam aanwezig is in het binnenste blok, zal deze standaard de waarde van een buitenblok overnemen, waardoor het bericht 'waarde vóór binnenblok' wordt afgedrukt.
  • De variabele 'var2' in het buitenste blok heeft de waarde 'waarde na binnenste blok' gekregen. Maar deze opdracht is gebeurd na de definitie van een binnenblok. Daarom is deze waarde niet aanwezig in het binnenste blok.

Voorbeeld 2: In dit voorbeeld gaan we het verschil vinden tussen twee getallen, één gedeclareerd in het buitenste blok en een ander in het binnenste blok. Beide zullen dezelfde naam hebben. Laten we eens kijken hoe block label nuttig is bij het verwijzen naar deze variabelen.

Bereiken in genest blok

<<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;
/

Code Verklaring:

  • Coderegel 1: Het buitenste blok labelen als "OUTER_BLOCK".
  • Coderegel 3: Een variabele 'ln_val' declareren als NUMBER met de initiële waarde “5”.
  • Coderegel 5: Het binnenste blok labelen als "INNER_BLOCK"
  • Coderegel 7: Een variabele 'ln_val' in het binnenste blok declareren als NUMBER met de initiële waarde “3”.
  • Coderegel 9: Het verschil in waarde van 'ln_val' afdrukken tussen het buitenste en binnenste blok. De " . ”-formaat wordt gebruikt om naar deze variabelen te verwijzen om conflicten vanwege dezelfde variabelenaam te voorkomen.

Samenvatting

In deze zelfstudie hebben we geleerd hoe u een genest blok kunt maken en hoe u met de reikwijdte in het binnenste en buitenste blok kunt omgaan. We hebben ook een voorbeeld gezien waarbij de variabelen uit het binnenste en buitenste blok binnen het binnenste blok werden verwezen.