Ambito variabile PL/SQL e blocco esterno interno: struttura nidificata
⚡ Riepilogo intelligente
I blocchi annidati in PL/SQL posizionano un blocco all'interno di un altro, consentendo di separare la logica complessa e isolare la gestione delle eccezioni. La comprensione dell'ambito delle variabili tra i blocchi esterni e interni e l'utilizzo di etichette di blocco mantengono le variabili con lo stesso nome non ambigue.
Che cosa sono i blocchi nidificati Oracle?
In PL / SQL, ogni blocco può essere annidato all'interno di un altro blocco. Tale blocco è chiamato blocco annidato. I blocchi annidati sono molto comuni quando si desidera eseguire un determinato processo mantenendoping il codice per quel processo in un contenitore (blocco) separato.
Il concetto di blocco annidato aiuta il programmatore a migliorare la leggibilità separando la logica complessa in blocchi individuali e consente eccezione per ciascun blocco da gestire all'interno del blocco esterno principale.
Struttura a blocchi nidificati
Un blocco può essere annidato all'interno di un altro blocco. Può essere annidato nella parte di esecuzione o nella parte di gestione delle eccezioni, e questi blocchi possono anche essere etichettati. Un blocco esterno può contenere molti blocchi interni. Ogni blocco interno è a sua volta un Blocco PL/SQLPertanto, tutte le proprietà e le caratteristiche del blocco interno sono le stesse di quelle del blocco esterno. Il blocco padre è il blocco principale, mentre il blocco figlio è il blocco annidato.
L'immagine sottostante fornisce una rappresentazione grafica della struttura a blocchi annidati, in cui il blocco genitore è il blocco principale e il blocco figlio è il blocco annidato.
Di seguito è riportata la sintassi per il blocco annidato. Lo screenshot sottostante mostra la sintassi del blocco annidato con i blocchi esterno e interno etichettati.
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 sopra riportata mostra il blocco annidato che contiene un totale di due blocchi.
- Questi blocchi sono etichettati come 'outer_block' e 'inner_block'.
Ambiti nel blocco annidato: ambito variabile
In un 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 sono visibili, quindi è fondamentale comprenderne appieno il funzionamento.
I punti seguenti riassumono gli 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.
- Il blocco esterno e il blocco interno possono avere un variabile con lo stesso nome.
- Nel caso di variabili con lo stesso nome, il blocco interno, per impostazione predefinita, fa riferimento solo alla variabile dichiarata nel blocco interno stesso.
- Se il blocco interno vuole fare riferimento alla variabile del blocco esterno che ha lo stesso nome della variabile del blocco interno, allora il blocco esterno deve essere ETICHETTATO e alla variabile del blocco esterno si può fare riferimento come ' . '.
L'esempio seguente ti aiuterà a comprendere meglio questi ambiti.
Esempio 1: In questo esempio, vediamo l'ambito delle variabili nel blocco interno ed esterno. Vediamo anche come fare riferimento alle variabili utilizzando un'etichetta di blocco.
La schermata seguente mostra l'Esempio 1, in cui il blocco interno fa riferimento a una variabile di un blocco esterno utilizzando l'etichetta del blocco.
<<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 Spiegazione:
- Code riga 1: Etichettare il blocco esterno come "OUTER_BLOCK".
- Code riga 3: Dichiarazione di una variabile 'var1' come VARCHAR2 (30) con il valore iniziale di "outer_block".
- Code riga 4: Dichiarazione di una variabile 'var2' come VARCHAR2 (30) con il valore iniziale di "valore prima del blocco interno".
- Code riga 6: Etichettare il blocco interno come "INNER_BLOCK".
- Code riga 8: Dichiarazione di una variabile 'var1' nel blocco interno come VARCHAR2 (30) con il valore iniziale di "inner_block".
- Code riga 10: Stampa il valore di 'var1'. Poiché non è specificata alcuna etichetta, per impostazione predefinita viene preso il valore dal blocco interno, quindi viene stampato il messaggio 'inner_block'.
- Code riga 11: Stampa il valore della variabile 'var1' del blocco esterno. Poiché il blocco interno ha una variabile con lo stesso nome, facciamo riferimento all'etichetta del blocco esterno. Pertanto, viene stampato il messaggio 'outer_block'.
- Code riga 12: Stampa il valore della variabile 'var2' del blocco esterno. Poiché non esiste una variabile con questo nome nel blocco interno, per impostazione predefinita viene preso il valore dal blocco esterno, quindi viene visualizzato il messaggio 'valore prima del blocco interno'.
- Alla variabile 'var2' nel blocco esterno viene assegnato il valore 'valore dopo il blocco interno'. Tuttavia, questa assegnazione avviene dopo la definizione del blocco interno, quindi tale valore non è presente all'interno del blocco interno.
Esempio 2: In questo esempio, troviamo la differenza tra due numeri, uno dichiarato nel blocco esterno e l'altro nel blocco interno. Entrambi hanno lo stesso nome. Vediamo come l'etichetta del blocco sia utile per fare riferimento a queste variabili.
La schermata seguente mostra l'Esempio 2, che calcola la differenza tra le variabili del blocco esterno e del blocco interno con lo stesso nome.
<<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 Spiegazione:
- Code riga 1: Etichettare il blocco esterno come "OUTER_BLOCK".
- Code riga 3: Dichiarazione di una variabile 'ln_val' di tipo NUMBER con valore iniziale "5".
- Code riga 5: Etichettare il blocco interno come "INNER_BLOCK".
- Code riga 7: Dichiarazione di una variabile 'ln_val' nel blocco interno come NUMBER con il valore iniziale di "3".
- Code riga 9: Stampa la differenza di valore di 'ln_val' dal blocco esterno e da quello interno. Il “ . Il formato " viene utilizzato per fare riferimento a queste variabili al fine di evitare conflitti dovuti allo stesso nome di variabile.





