Cos'è Nested Blocks Oracle?
In PL / SQL, ogni blocco può essere annidato in un altro blocco. Sono indicati come un blocco nidificato. I blocchi annidati 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 annidato aiuterà il programmatore a migliorare la leggibilità separando le cose complesse in ogni blocco e a gestire l'eccezione per ogni blocco all'interno del blocco esterno principale.
In questo tutorial imparerai-
- Struttura a blocchi annidati
- Ambiti nel blocco annidato: ambito variabile
Struttura a blocchi annidati
Un blocco può essere annidato in un altro blocco. Questo può essere annidato nella parte di esecuzione o nella parte di gestione delle eccezioni. Questi blocchi possono anche essere etichettati. Un blocco esterno può contenere molti blocchi interni. Ogni blocco interno è ancora una volta un blocco PL / SQL, quindi tutte le proprietà e le caratteristiche del blocco interno saranno le stesse del blocco esterno. L'immagine sotto fornisce la rappresentazione pittorica della struttura a blocchi annidati. Il blocco padre è il blocco principale e il blocco figlio è il blocco annidato.
Di seguito è riportata la sintassi per il blocco annidato.
Sintassi del blocco annidato
<>DECLARE BEGIN < >DECLARE BEGIN .EXCEPTION END; EXCEPTION END;
- La sintassi precedente mostra il blocco nidificato che contiene un totale di due blocchi.
- Questi blocchi sono etichettati come "outer_block" e "inner_block"
Ambiti nel blocco annidato: ambito variabile
Nel blocco annidato, è necessario comprendere chiaramente l'ambito e la visibilità di ciascun blocco prima di utilizzarli. In particolare nel blocco interno, gli elementi sia del blocco esterno che di quello interno saranno visibili, quindi è necessaria una corretta comprensione di questo.
I punti seguenti riassumeranno di più riguardo agli ambiti nei blocchi annidati.
- 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.
- Blocco esterno e Blocco interno possono avere una variabile con lo stesso nome.
- In caso di variabili con lo stesso nome, blocco interno di default, farà riferimento alla variabile dichiarata solo nel blocco interno.
- Se il blocco interno desidera fare riferimento alla variabile del blocco esterno che ha lo stesso nome di quella del blocco interno, il blocco esterno deve essere ETICHETTATO e la variabile del blocco esterno può essere denominata "
. "
L'esempio seguente aiuterà a capire di più su 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 di blocco.
<>DECLAREvarl VARCHAR2(30):='outer_block';var2 VARCHAR2(30):='value before inner block’;BEGIN< >DECLAREvarl VARCHAR2(30):='inner_block';BEGINdbms_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 : dichiarazione di una variabile 'var1' come VARCHAR2 (30) con il valore iniziale di "blocco esterno".
- Riga di codice 4 : dichiarazione di una variabile 'var2' come VARCHAR2 (30) con il valore iniziale di "valore prima del blocco interno".
- Riga di codice 6: etichettatura del blocco interno come "INNER_BLOCK"
- Riga di codice 8: dichiarazione di 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é nessuna etichetta è menzionata per impostazione predefinita, prenderà il valore da un blocco interno, quindi stampando il messaggio 'inner_block'.
- Riga di codice 11: stampa il valore della variabile del blocco esterno 'var1'. Poiché il blocco interno ha la variabile con lo stesso nome, è necessario fare riferimento all'etichetta del blocco esterno. Stampando così il messaggio 'blocco esterno'.
- Riga di codice 12: stampa il 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 stampando 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 fare riferimento a queste variabili.
<>DECLAREln_val NUMBER :=5;BEGIN< >DECLAREln_val NUMBER :=3;BEGINdbms_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 codice 3 : dichiarazione di una variabile "ln_val" come NUMERO con valore iniziale "5".
- Riga di codice 5: etichettatura del blocco interno come "INNER_BLOCK"
- Riga di codice 7: dichiarazione di 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" dal blocco esterno e da quello interno. 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 sono state riferite all'interno del blocco interno.