Alcance variable PL/SQL y bloque exterior interior: estructura anidada
โก Resumen inteligente
En PL/SQL, los bloques anidados colocan un bloque dentro de otro, lo que permite separar la lรณgica compleja y aislar el manejo de excepciones. Comprender el alcance de las variables entre los bloques externos e internos, y usar etiquetas de bloque, evita la ambigรผedad entre variables con el mismo nombre.

ยฟQuรฉ son los bloques anidados? Oracle?
In PL / SQLCada bloque puede estar anidado dentro de otro bloque. Dicho bloque se denomina bloque anidado. Los bloques anidados son muy comunes cuando se desea realizar un proceso determinado mientras se mantieneping el cรณdigo para ese proceso en un contenedor (bloque) separado.
El concepto de bloques anidados ayuda al programador a mejorar la legibilidad al separar la lรณgica compleja en bloques individuales, y permite la excepciรณn para cada bloque que se va a procesar dentro del bloque exterior principal.
Estructura de bloque anidado
Un bloque puede estar anidado dentro de otro bloque. Puede estar anidado tanto en la parte de ejecuciรณn como en la parte de manejo de excepciones, y estos bloques tambiรฉn pueden estar etiquetados. Un bloque externo puede contener muchos bloques internos. Cada bloque interno es en sรญ mismo un Bloque PL / SQLPor lo tanto, todas las propiedades y caracterรญsticas del bloque interno son las mismas que las del bloque externo. El bloque padre es el bloque principal, y el bloque hijo es el bloque anidado.
La imagen que aparece a continuaciรณn ofrece una representaciรณn grรกfica de la estructura de bloques anidados, en la que el bloque padre es el bloque principal y el bloque hijo es el bloque anidado.
A continuaciรณn se muestra la sintaxis del bloque anidado. La siguiente captura de pantalla muestra la sintaxis del bloque anidado con sus bloques interno y externo etiquetados.
Sintaxis de bloque anidado
<<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 sintaxis anterior muestra el bloque anidado que contiene un total de dos bloques.
- Estos bloques estรกn etiquetados como 'outer_block' e 'inner_block'.
รmbitos en bloque anidado: รกmbito variable
En un bloque anidado, es necesario comprender claramente el alcance y la visibilidad de cada bloque antes de utilizarlos. En particular, en el bloque interno, los elementos tanto del bloque externo como del interno son visibles, por lo que es fundamental comprender bien este aspecto.
Los puntos que se describen a continuaciรณn resumen los รกmbitos de aplicaciรณn en bloques anidados.
- Los elementos declarados en el bloque exterior, y el valor definido antes de la definiciรณn del bloque interior, son visibles dentro del bloque interior.
- Los elementos declarados en el bloque interior no son visibles en el bloque exterior. Solo son visibles dentro del bloque interior.
- El bloque exterior y el bloque interior pueden tener un variable con el mismo nombre
- En el caso de variables con el mismo nombre, el bloque interno, por defecto, se refiere รบnicamente a la variable declarada en dicho bloque.
- Si el bloque interno quiere referirse a la variable del bloque externo que tiene el mismo nombre que la variable del bloque interno, entonces el bloque externo debe estar ETIQUETADO y la variable del bloque externo puede ser referenciada como ' . '.
El siguiente ejemplo le ayudarรก a comprender mejor estos รกmbitos.
Ejemplo 1: En este ejemplo, vemos el alcance de las variables en el bloque interno y externo. Tambiรฉn vemos cรณmo hacer referencia a las variables mediante una etiqueta de bloque.
La captura de pantalla que aparece a continuaciรณn muestra el Ejemplo 1, donde el bloque interno hace referencia a una variable del bloque externo mediante la etiqueta del bloque.
<<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 Explicaciรณn:
- Code lรญnea 1: Etiquetar el bloque exterior como โOUTER_BLOCKโ.
- Code lรญnea 3: Declarar una variable 'var1' como VARCHAR2 (30) con el valor inicial de โouter_blockโ.
- Code lรญnea 4: Declarar una variable 'var2' como VARCHAR2 (30) con el valor inicial de โvalor antes del bloque internoโ.
- Code lรญnea 6: Etiquetar el bloque interior como โINNER_BLOCKโ.
- Code lรญnea 8: Declarar una variable 'var1' en el bloque interno como VARCHAR2 (30) con el valor inicial de โinner_blockโ.
- Code lรญnea 10: Se imprime el valor de 'var1'. Como no se menciona ninguna etiqueta, por defecto toma el valor del bloque interno, por lo que se imprime el mensaje 'inner_block'.
- Code lรญnea 11: Se imprime el valor de la variable 'var1' del bloque externo. Dado que el bloque interno tiene una variable con el mismo nombre, nos referimos a la etiqueta del bloque externo. Por lo tanto, se imprime el mensaje 'outer_block'.
- Code lรญnea 12: Se imprime el valor de la variable 'var2' del bloque externo. Como no existe ninguna variable con ese nombre en el bloque interno, por defecto toma el valor del bloque externo, por lo que se imprime el mensaje 'valor antes del bloque interno'.
- La variable 'var2' en el bloque externo recibe el valor 'valor despuรฉs del bloque interno'. Sin embargo, esta asignaciรณn se realiza despuรฉs de la definiciรณn del bloque interno, por lo que este valor no estรก presente dentro del bloque interno.
Ejemplo 2: En este ejemplo, encontramos la diferencia entre dos nรบmeros, uno declarado en el bloque exterior y otro en el bloque interior. Ambos tienen el mismo nombre. Veamos cรณmo la etiqueta del bloque resulta รบtil para referirse a estas variables.
La captura de pantalla que aparece a continuaciรณn muestra el Ejemplo 2, que calcula la diferencia entre las variables del bloque externo e interno con el mismo nombre.
<<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 Explicaciรณn:
- Code lรญnea 1: Etiquetar el bloque exterior como โOUTER_BLOCKโ.
- Code lรญnea 3: Declarar una variable 'ln_val' como NUMBER con el valor inicial de โ5โ.
- Code lรญnea 5: Etiquetar el bloque interior como โINNER_BLOCKโ.
- Code lรญnea 7: Declarar una variable 'ln_val' en el bloque interno como NUMBER con el valor inicial de โ3โ.
- Code lรญnea 9: Imprimir la diferencia en el valor de 'ln_val' del bloque exterior e interior. El โ . El formato โ se utiliza para referirse a estas variables y evitar conflictos debido a que tengan el mismo nombre.




