PL/SQL variabel omfattning & inre yttre block: kapslad struktur

Vad är Nested Blocks Oracle?

I PL/SQL kan varje block kapslas in i ett annat block. De kallas ett kapslat block. Kapslade block är mycket vanliga när vi vill utföra den specifika processen, och samtidigt bör koden för dessa processer förvaras i en separat behållare (block).

Konceptet med kapslade block kommer att hjälpa programmeraren att förbättra läsbarheten genom att separera de komplexa sakerna i varje block och att hantera undantaget för varje block inuti det yttre huvudblocket.

Kapslad blockstruktur

Ett block kan kapslas in i ett annat block. Detta kan kapslas antingen i exekveringsdelen eller i undantagshantering del. Dessa block kan också märkas. Ett yttre block kan innehålla många inre block. Varje inre block är återigen en PL/SQL-block, därför kommer alla egenskaper och egenskaper hos det inre blocket att vara desamma som det yttre blocket. Bilden nedan ger en bildrepresentation av kapslad blockstruktur. Det överordnade blocket är huvudblocket och det underordnade blocket är det kapslade blocket.

Kapslad blockstruktur

Nedan är syntaxen för det kapslade blocket.

Kapslad blockstruktur

Kapslad blocksyntax

<<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;
  • Ovanstående syntax visar det kapslade blocket som innehåller totalt två block.
  • Dessa block är märkta som 'outer_block' och 'inner_block'

Omfattningar i kapslade block: Variabelt omfattning

I kapslade block måste man förstå omfattningen och synligheten för varje block tydligt innan man använder dem. Särskilt i det inre blocket kommer elementen från både det yttre och det inre blocket att vara synliga, därför är det nödvändigt att förstå detta.

Nedanstående punkter kommer att sammanfatta mer om omfattningen i kapslade block.

  • Elementen som deklareras i det yttre blocket och värdet som definieras före den inre blockdefinitionen är synliga inuti det inre blocket.
  • Elementen som deklareras i det inre blocket är inte synliga i det yttre blocket. De är endast synliga inom det inre blocket.
  • Ytterblock och Innerblock kan ha en variabel med samma namn.
  • I fallet med variabler med samma namn kommer inre block som standard endast att referera till variabeln som deklareras i det inre blocket.
  • Om det inre blocket vill hänvisa till den yttre blockvariabeln som har samma namn som den för det inre blocket, ska det yttre blocket märkas och den yttre blockvariabeln kan kallas ' . '

Exemplet nedan hjälper dig att förstå mer om dessa omfattningar.

Exempelvis 1: I det här exemplet kommer vi att se omfattningen av variabler i det inre och yttre blocket. Vi kommer också att se hur man refererar variablerna med blocketikett.

Scopes i kapslat block

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

Kodförklaring:

  • Kodrad 1: Märkning av det yttre blocket som "OUTER_BLOCK".
  • Kodrad 3: Deklarerar en variabel 'var1' som VARCHAR2 (30) med initialvärdet "yttre block".
  • Kodrad 4: Deklarerar en variabel 'var2' som VARCHAR2 (30) med initialvärdet "värde före innerblock".
  • Kodrad 6: Märkning av det inre blocket som "INNER_BLOCK"
  • Kodrad 8: Deklarera en variabel 'var1' i det inre blocket som VARCHAR2 (30) med initialvärdet "inner block".
  • Kodrad 10: Skriver ut värdet för 'var1'. Eftersom ingen etikett nämns som standard kommer den att ta värdet från ett inre block, vilket gör att meddelandet "inner_block" skrivs ut.
  • Kodrad 11: Skriver ut värdet för den yttre blockvariabeln 'var1'. Eftersom det inre blocket har variabeln med samma namn, måste vi hänvisa till yttre blocketikett. Skriver alltså ut meddelandet 'yttre block'.
  • Kodrad 12: Skriver ut värdet för den yttre blockvariabeln 'var2'. Eftersom det inte finns någon variabel med detta namn i det inre blocket, kommer den som standard att ta värdet från ett yttre block, vilket gör att meddelandet "värde före inre block" skrivs ut.
  • Variabeln 'var2' i det yttre blocket har tilldelats värdet 'värde efter inre block'. Men detta uppdrag har skett efter definitionen av ett inre block. Detta värde finns därför inte i det inre blocket.

Exempelvis 2: I det här exemplet ska vi hitta skillnaden mellan två tal, ett deklarerat i det yttre blocket och ett annat i det inre blocket. Båda kommer att ha samma namn. Låt oss se hur blocketiketten är användbar för att hänvisa till dessa variabler.

Scopes i kapslat block

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

Kodförklaring:

  • Kodrad 1: Märkning av det yttre blocket som "OUTER_BLOCK".
  • Kodrad 3: Deklarerar en variabel 'ln_val' som NUMBER med startvärdet "5".
  • Kodrad 5: Märkning av det inre blocket som "INNER_BLOCK"
  • Kodrad 7: Deklarera en variabel 'ln_val' i det inre blocket som NUMBER med startvärdet "3".
  • Kodrad 9: Skriver ut skillnaden i värde för 'ln_val' från yttre och inre block. den " . ”-format används för att referera till dessa variabler för att undvika konflikter på grund av samma variabelnamn.

Sammanfattning

I den här handledningen har vi lärt oss hur man skapar ett kapslat block och hur man hanterar omfattningen i inre block och yttre block. Vi har också sett ett exempel där variablerna från det inre och yttre blocket refererades inuti det inre blocket.