PL/SQL variabel omfattning & inre yttre block: kapslad struktur
โก Smart sammanfattning
Kapslade block i PL/SQL placerar ett block inuti ett annat, vilket lรฅter dig separera komplex logik och isolera undantagshantering. Att fรถrstรฅ variabelomfรฅnget mellan de yttre och inre blocken, och anvรคnda blocketiketter, hรฅller variabler med samma namn otvetydiga.

Vad รคr Nested Blocks Oracle?
In PL / SQL, varje block kan vara nรคstlat inuti ett annat block. Ett sรฅdant block kallas ett nรคstlat block. Nรคstlade block รคr mycket vanliga nรคr du vill utfรถra en viss process samtidigt som du hรฅllerping koden fรถr den processen i en separat behรฅllare (block).
Konceptet med kapslade block hjรคlper programmeraren att fรถrbรคttra lรคsbarheten genom att separera komplex logik i individuella block, och det gรถr det mรถjligt fรถr undantag fรถr varje block som ska hanteras inuti det yttre huvudblocket.
Kapslad blockstruktur
Ett block kan nรคstlas inuti ett annat block. Det kan nรคstlas antingen i exekveringsdelen eller i undantagshanteringsdelen, och dessa block kan ocksรฅ mรคrkas. Ett yttre block kan innehรฅlla mรฅnga inre block. Varje inre block รคr i sig ett PL/SQL-block, sรฅ alla egenskaper och karakteristika fรถr det inre blocket รคr desamma som fรถr det yttre blocket. Fรถrรคlderblocket รคr huvudblocket och barnblocket รคr det kapslade blocket.
Bilden nedan ger en illustrerande representation av den kapslade blockstrukturen, dรคr fรถrรคlderblocket รคr huvudblocket och barnblocket รคr det kapslade blocket.
Nedan visas syntaxen fรถr det kapslade blocket. Skรคrmdumpen nedan visar syntaxen fรถr det kapslade blocket med dess mรคrkta yttre och inre block.
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;
- Syntaxen ovan visar det kapslade blocket som innehรฅller totalt tvรฅ block.
- Dessa block รคr mรคrkta som 'yttre_block' och 'inner_block'.
Omfattningar i kapslade block: Variabelt omfattning
I ett kapslat block mรฅste du tydligt fรถrstรฅ omfattningen och synligheten av varje block innan du anvรคnder dem. Sรคrskilt i det inre blocket รคr element frรฅn bรฅde det yttre och det inre blocket synliga, sรฅ en ordentlig fรถrstรฅelse av detta รคr nรถdvรคndig.
Punkterna nedan sammanfattar omfรฅngen i kapslade block.
- Elementen som deklarerats i det yttre blocket, och vรคrdet som definierats fรถre definitionen av det inre blocket, syns inuti det inre blocket.
- Elementen som deklareras i det inre blocket syns inte i det yttre blocket. De syns endast inuti det inre blocket.
- Det yttre blocket och det inre blocket kan ha en variabel med samma namn.
- Nรคr det gรคller variabler med samma namn refererar det innerblocket som standard endast till den variabel som deklarerats i det innerblocket.
- Om det inre blocket vill referera till den yttre blockvariabeln som har samma namn som den inre blockvariabeln, mรฅste det yttre blocket vara LABELAD, och den yttre blockvariabeln kan refereras till som ' . '.
Exemplet nedan hjรคlper dig att fรถrstรฅ mer om dessa omfรฅng.
Exempel 1: I det hรคr exemplet ser vi omfattningen av variabler i det inre och yttre blocket. Vi ser ocksรฅ hur man refererar till variablerna med hjรคlp av en blocketikett.
Skรคrmdumpen nedan visar exempel 1, dรคr det inre blocket refererar till en yttre blockvariabel med hjรคlp av blocketiketten.
<<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 Fรถrklaring:
- Code rad 1: Mรคrker det yttre blocket som "OUTER_BLOCK".
- Code rad 3: Deklarera variabeln 'var1' som VARCHAR2 (30) med initialvรคrdet "outer_block".
- Code rad 4: Deklarera en variabel 'var2' som VARCHAR2 (30) med initialvรคrdet "vรคrde fรถre innerblock".
- Code rad 6: Mรคrker det inre blocket som โINNER_BLOCKโ.
- Code rad 8: Deklarera en variabel 'var1' i det inre blocket som VARCHAR2 (30) med initialvรคrdet "inner_block".
- Code rad 10: Skriver ut vรคrdet fรถr 'var1'. Eftersom ingen etikett nรคmns, hรคmtas som standard vรคrdet frรฅn det inre blocket, vilket innebรคr att meddelandet 'inner_block' skrivs ut.
- Code rad 11: Skriver ut vรคrdet fรถr den yttre blockvariabeln 'var1'. Eftersom det inre blocket har en variabel med samma namn hรคnvisar vi till den yttre blocketiketten. Sรฅledes skriver den ut meddelandet 'outer_block'.
- Code rad 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, tar den som standard vรคrdet frรฅn det yttre blocket, vilket innebรคr att meddelandet 'vรคrde fรถre innerblock' skrivs ut.
- Variabeln 'var2' i det yttre blocket tilldelas vรคrdet 'vรคrde efter innerblock'. Men denna tilldelning sker efter definitionen av det inre blocket, sรฅ detta vรคrde finns inte inuti det inre blocket.
Exempel 2: I det hรคr exemplet hittar vi skillnaden mellan tvรฅ tal, ett deklarerat i det yttre blocket och ett annat i det inre blocket. Bรฅda har samma namn. Lรฅt oss se hur blocketiketten รคr anvรคndbar fรถr att referera till dessa variabler.
Skรคrmdumpen nedan visar exempel 2, som berรคknar skillnaden mellan de yttre och inre blockvariablerna med samma namn.
<<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 Fรถrklaring:
- Code rad 1: Mรคrker det yttre blocket som "OUTER_BLOCK".
- Code rad 3: Deklarera en variabel 'ln_val' som NUMBER med initialvรคrdet "5".
- Code rad 5: Mรคrker det inre blocket som โINNER_BLOCKโ.
- Code rad 7: Deklarera en variabel 'ln_val' i det inre blocket som NUMBER med initialvรคrdet "3".
- Code rad 9: Skriver ut skillnaden i vรคrde fรถr 'ln_val' frรฅn det yttre och inre blocket. . โ-formatet anvรคnds fรถr att referera till dessa variabler fรถr att undvika konflikter pรฅ grund av samma variabelnamn.




