Ambito variabile PL/SQL e blocco esterno interno: struttura nidificata

Che cosa sono i blocchi nidificati Oracle?

In PL/SQL, ogni blocco può essere annidato in un altro blocco. Sono indicati come blocchi nidificati. I blocchi nidificati sono molto comuni quando vogliamo eseguire un determinato processo e, allo stesso tempo, il codice per questi processi dovrebbe essere conservato in un contenitore separato (blocco).

Il concetto di blocco nidificato aiuterà il programmatore a migliorare la leggibilità separando gli elementi complessi in ogni blocco e a gestire l'eccezione per ogni blocco all'interno del blocco esterno principale.

Struttura a blocchi nidificati

Un blocco può essere annidato in un altro blocco. Questo può essere annidato nella parte di esecuzione o nel file la gestione delle eccezioni parte. Questi blocchi possono anche essere etichettati. Un blocco esterno può contenere molti blocchi interni. Ogni blocco interno è ancora una volta a Blocco PL/SQL, quindi tutte le proprietà e le caratteristiche del blocco interno saranno le stesse del blocco esterno. L'immagine seguente fornisce la rappresentazione pittorica della struttura a blocchi nidificati. Il blocco genitore è il blocco principale e il blocco figlio è il blocco nidificato.

Struttura a blocchi nidificati

Di seguito è riportata la sintassi per il blocco nidificato.

Struttura a blocchi nidificati

Sintassi dei blocchi nidificati

<<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;
  • La sintassi precedente mostra il blocco nidificato che contiene un totale di due blocchi.
  • Questi blocchi sono etichettati come "blocco_esterno" e "blocco_interno"

Ambiti nel blocco annidato: ambito variabile

Nel blocco nidificato, è necessario comprendere chiaramente l'ambito e la visibilità di ciascun blocco prima di utilizzarlo. In particolare nel blocco interno, saranno visibili gli elementi sia del blocco esterno che di quello interno, quindi è necessaria una corretta comprensione di ciò.

I punti seguenti riassumeranno maggiormente gli ambiti nei blocchi nidificati.

  • Gli elementi dichiarati nel blocco esterno e il valore definito prima della definizione del blocco interno sono visibili all'interno del blocco interno.
  • Gli elementi dichiarati nel blocco interno non sono visibili nel blocco esterno. Sono visibili solo all'interno del blocco interno.
  • Il blocco esterno e il blocco interno possono avere una variabile con lo stesso nome.
  • In caso di variabili con lo stesso nome, blocco interno per impostazione predefinita, farà riferimento solo alla variabile dichiarata nel blocco interno.
  • Se il blocco interno vuole fare riferimento alla variabile del blocco esterno che ha lo stesso nome di quella del blocco interno, allora il blocco esterno dovrebbe essere ETICHETTATO e la variabile del blocco esterno può essere definita come ' . '

L'esempio seguente aiuterà a comprendere meglio questi ambiti.

esempio 1: In questo esempio, vedremo l'ambito delle variabili nel blocco interno ed esterno. Inoltre, vedremo come fare riferimento alle variabili utilizzando l'etichetta del blocco.

Ambiti nel blocco annidato

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

Spiegazione del codice:

  • Riga di codice 1: Etichettatura del blocco esterno come “OUTER_BLOCK”.
  • Riga di codice 3: Dichiarare una variabile 'var1' come VARCHAR2 (30) con il valore iniziale di "blocco esterno".
  • Riga di codice 4: Dichiarare una variabile 'var2' come VARCHAR2 (30) con il valore iniziale di "valore prima del blocco interno".
  • Riga di codice 6: Etichettare il blocco interno come “INNER_BLOCK”
  • Riga di codice 8: Dichiarare una variabile 'var1' nel blocco interno come VARCHAR2 (30) con il valore iniziale di "blocco interno".
  • Riga di codice 10: Stampa del valore di 'var1'. Poiché per impostazione predefinita non viene menzionata alcuna etichetta, prenderà il valore da un blocco interno, quindi stamperà il messaggio 'inner_block'.
  • Riga di codice 11: Stampa del valore della variabile del blocco esterno 'var1'. Poiché il blocco interno ha la variabile con lo stesso nome, dobbiamo fare riferimento all'etichetta del blocco esterno. Stampando così il messaggio "blocco esterno".
  • Riga di codice 12: Stampa del valore della variabile del blocco esterno 'var2'. Poiché non è presente alcuna variabile con questo nome nel blocco interno, per impostazione predefinita prenderà il valore da un blocco esterno, quindi stamperà il messaggio "valore prima del blocco interno".
  • Alla variabile 'var2' nel blocco esterno è stato assegnato il valore 'valore dopo il blocco interno'. Ma questa assegnazione è avvenuta dopo la definizione di un blocco interno. Quindi questo valore non è presente nel blocco interno.

esempio 2: In questo esempio, troveremo la differenza tra due numeri, uno dichiarato nel blocco esterno e un altro nel blocco interno. Entrambi avranno lo stesso nome. Vediamo come l'etichetta del blocco è utile nel riferire queste variabili.

Ambiti nel blocco annidato

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

Spiegazione del codice:

  • Riga di codice 1: Etichettatura del blocco esterno come “OUTER_BLOCK”.
  • Riga di codice 3: Dichiarare una variabile 'ln_val' come NUMERO con il valore iniziale di "5".
  • Riga di codice 5: Etichettare il blocco interno come “INNER_BLOCK”
  • Riga di codice 7: Dichiarare una variabile 'ln_val' nel blocco interno come NUMERO con il valore iniziale di "3".
  • Riga di codice 9: Stampa della differenza di valore di 'ln_val' tra il blocco esterno e quello interno. IL " . Il formato " viene utilizzato per fare riferimento a queste variabili per evitare conflitti dovuti allo stesso nome di variabile.

Sommario

In questo tutorial abbiamo imparato come creare un blocco nidificato e come gestire l'ambito nel blocco interno e nei blocchi esterni. Abbiamo anche visto un esempio in cui le variabili del blocco interno ed esterno venivano riferite all'interno del blocco interno.