PL/SQL Variabelt omfang og indre ytre blokk: Nestet struktur

Hva er Nested Blocks Oracle?

I PL/SQL kan hver blokk nestes inn i en annen blokk. De omtales som en nestet blokk. Nestede blokker er svært vanlige når vi ønsker å utføre den bestemte prosessen, og samtidig bør koden for disse prosessene oppbevares i en egen beholder (blokk).

Nested block-konsept vil hjelpe programmereren til å forbedre lesbarheten ved å separere de komplekse tingene i hver blokk og håndtere unntaket for hver blokk inne i den ytre hovedblokken.

Nestet blokkstruktur

En blokk kan nestes inn i en annen blokk. Dette kan nestes enten i utførelsesdelen eller i avvikshåndtering del. Disse blokkene kan også merkes. En ytre blokk kan inneholde mange indre blokker. Hver indre blokk er igjen en PL/SQL-blokk, derfor vil alle egenskapene og egenskapene til den indre blokken være de samme som ytre blokk. Bildet nedenfor gir en billedlig representasjon av nestet blokkstruktur. Overordnet blokk er hovedblokken og barneblokk er den nestede blokken.

Nestet blokkstruktur

Nedenfor er syntaksen for den nestede blokken.

Nestet blokkstruktur

Nestet blokksyntaks

<<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;
  • Syntaksen ovenfor viser den nestede blokken som inneholder totalt to blokker.
  • Disse blokkene er merket som 'outer_block' og 'inner_block'

Omfang i nestet blokk: Variabelt omfang

I nestet blokk må man forstå omfanget og synligheten til hver blokk tydelig før man bruker dem. Spesielt i den indre blokken vil elementene fra både ytre og indre blokk være synlige, derfor er god forståelse av dette nødvendig.

Punktene nedenfor vil oppsummere mer om omfanget i nestede blokker.

  • Elementene som er deklarert i den ytre blokken og verdien som er definert før den indre blokkdefinisjonen er synlig inne i den indre blokken.
  • Elementene som er deklarert i den indre blokken er ikke synlige i den ytre blokken. De er kun synlige innenfor den indre blokken.
  • Ytre blokk og indre blokk kan ha en variabel med samme navn.
  • I tilfelle av variabler med samme navn, vil indre blokk som standard kun referere til variabelen som er deklarert i indre blokk.
  • Hvis indre blokk ønsker å referere til den ytre blokkvariabelen som har samme navn som den indre blokken, skal den ytre blokken merkes, og den ytre blokkvariabelen kan refereres til som ' . '

Eksempelet nedenfor vil hjelpe deg å forstå mer om disse omfangene.

Eksempel 1: I dette eksemplet skal vi se omfanget av variabler i den indre og ytre blokken. Vi skal også se hvordan vi refererer til variablene ved å bruke blokketikett.

Omfang i nestet blokk

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

Kodeforklaring:

  • Kodelinje 1: Merking av den ytre blokken som "OUTER_BLOCK".
  • Kodelinje 3: Erklærer en variabel 'var1' som VARCHAR2 (30) med startverdien "ytre blokk".
  • Kodelinje 4: Erklærer en variabel 'var2' som VARCHAR2 (30) med startverdien "verdi før indre blokk".
  • Kodelinje 6: Merke den indre blokken som "INNER_BLOCK"
  • Kodelinje 8: Erklære en variabel 'var1' i den indre blokken som VARCHAR2 (30) med startverdien "indre blokk".
  • Kodelinje 10: Skriver ut verdien til 'var1'. Siden ingen etikett er nevnt som standard, vil den ta verdien fra en indre blokk, og skriver derfor ut 'inner_block'-meldingen.
  • Kodelinje 11: Skriver ut verdien til den ytre blokkvariabelen 'var1'. Siden den indre blokken har variabelen med samme navn, må vi referere til ytre blokketikett. Dermed skrives ut meldingen 'ytre blokk'.
  • Kodelinje 12: Skriver ut verdien til den ytre blokkvariabelen 'var2'. Siden det ikke finnes noen variabel med dette navnet i den indre blokken, vil den som standard ta verdien fra en ytre blokk, og skriver derfor ut 'verdi før indre blokk'-melding.
  • Variabelen 'var2' i den ytre blokken har blitt tildelt verdien 'verdi etter indre blokk'. Men denne oppgaven har skjedd etter definisjonen av en indre blokk. Derfor er denne verdien ikke til stede i den indre blokken.

Eksempel 2: I dette eksemplet skal vi finne forskjellen mellom to tall, ett erklært ved ytre blokk og et annet ved indre blokk. Begge vil ha samme navn. La oss se hvordan blokketikett er nyttig for å henvise til disse variablene.

Omfang i nestet blokk

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

Kodeforklaring:

  • Kodelinje 1: Merking av den ytre blokken som "OUTER_BLOCK".
  • Kodelinje 3: Erklærer en variabel 'ln_val' som NUMBER med startverdien "5".
  • Kodelinje 5: Merke den indre blokken som "INNER_BLOCK"
  • Kodelinje 7: Erklære en variabel 'ln_val' i indre blokk som NUMBER med startverdien "3".
  • Kodelinje 9: Skriver ut forskjellen i verdi av 'ln_val' fra ytre og indre blokk. « . formatet brukes til å referere til disse variablene for å unngå konflikter på grunn av samme variabelnavn.

Sammendrag

I denne opplæringen har vi lært hvordan du lager en nestet blokk og hvordan du håndterer omfanget i indre blokk og ytre blokker. Vi har også sett et eksempel hvor variablene fra den indre og ytre blokken ble referert inne i den indre blokken.