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.

  • ๐Ÿงฑ Kapslad block: Ett kapslat block รคr ett PL/SQL-block som placeras inuti ett annat blocks exekverings- eller undantagssektion.
  • ???? Yttre och inre: Ett yttre block, eller fรถrรคlderblock, kan innehรฅlla mรฅnga inre block, eller underblock, som vart och ett รคr ett fullstรคndigt PL/SQL-block.
  • ๐Ÿ‘๏ธ Variabel omfattning: Yttre blockvariabler som deklarerats fรถre ett inre block รคr synliga inuti det, men inre blockvariabler รคr inte synliga utanfรถr.
  • ๐Ÿท๏ธ Blockera etiketter: Genom att mรคrka det yttre blocket kan det inre blocket referera till en yttre variabel med samma namn som label.variable_name.
  • ๐Ÿ›ก๏ธ Undantagsisolering: Nรคstning lรฅter varje block hantera sina egna undantag, keeping felhantering nรคra koden som genererar den.
  • ๐Ÿค– AI-hjรคlp: AI-assistenter som GitHub Copilot utkast mรคrkte kapslade block och flaggade konflikter mellan variabelomfรฅng.

PL/SQL-variabelomfรฅng รถver kapslade inre och yttre block

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.

Bildrepresentation av ett PL/SQL-kapslat block med ett fรถrรคldra-yttre block och ett underordnat inre block

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.

Kapslade blocksyntax som visar mรคrkta yttre och inre block, vart och ett med DECLARE-, BEGIN- och EXCEPTION-sektionerna

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.

Exempel pรฅ variabelomfattning i kapslade block som refererar till en yttre blockvariabel med dess blocketikett

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

Exempel pรฅ berรคkning av skillnaden mellan yttre och inre blockvariabler med samma namn med hjรคlp av blocketiketter

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

Vanliga frรฅgor

Ett kapslat block รคr ett anonymt block som placeras inuti ett annat block och kรถrs inline dรคr det visas. delprogram (procedur eller funktion) รคr en namngiven, รฅteranvรคndbar enhet som lagras separat och anropas med namn, valfritt med parametrar.

Varje block kan ha sin egen EXCEPTION-sektion. Ett undantag som genereras i det inre blocket hanteras fรถrst av det blocket; om det inte hanteras, propagerar det till det omslutande yttre blockets hanterare. Detta lรฅter dig isolera felhanteringen per block.

PL/SQL har ingen liten fast grรคns, sรฅ block kan kapslas mรฅnga nivรฅer djupt. I praktiken skadar djup kapsling lรคsbarheten, sรฅ den mesta kod kapslas pรฅ tvรฅ eller tre nivรฅer och flyttar รฅteranvรคndbar logik till delprogram.

En blocketikett, skriven som ett namn inom dubbla vinkelparenteser fรถre DECLARE, namnger ett block. Etiketter lรฅter inre kod kvalificera en yttre variabel som label.variabelnamn och kan ocksรฅ fungera som GOTO-mรฅl, vilket gรถr kapslad kod lรคttare att lรคsa och dokumentera.

Ja. Ett kapslat block kan visas var som helst dรคr en kรถrbar sats รคr tillรฅten, inklusive inuti en loop, en IF-gren eller en procedur. Detta lรฅter dig begrรคnsa deklarationer och undantagshantering till bara den del av koden som behรถver dem.

Nรคstning รคr huvudsakligen ett struktureringsverktyg vid kompilering och tillfรถr ingen betydande runtime-overhead i sig sjรคlvt. Det fรถrbรคttrar lรคsbarhet och felisolering. ร–verdriven djupnรคstning kostar oftast underhรฅll snarare รคn rรฅ hastighet.

Ja. GitHub Copilot utkast mรคrkta yttre och inre block, inklusive avsnitten DECLARE, BEGIN och EXCEPTION, frรฅn en kommentar. RevVisa blocketiketterna och variabelomfรฅnget sรฅ att inre och yttre variabler med samma namn lรถses upp som avsett.

AI-assistenter analyserar kapslade block och flaggar skuggade variabler, okvalificerade referenser och รฅtkomst utanfรถr omfรฅnget. Denna granskning av maskininlรคrning belyser platser dรคr ett inre block i tysthet anvรคnder fel variabel med samma namn innan koden kรถrs.

Sammanfatta detta inlรคgg med: