Alcance variable PL/SQL y bloque exterior interior: estructura anidada
¿Qué son los bloques anidados? Oracle?
En PL/SQL, cada bloque se puede anidar en otro bloque. Se les conoce como bloque anidado. Los bloques anidados son muy comunes cuando queremos realizar un proceso determinado y, al mismo tiempo, el código para estos procesos debe guardarse en un contenedor (bloque) separado.
El concepto de bloque anidado ayudará al programador a mejorar la legibilidad al separar las cosas complejas en cada bloque y manejar la excepción para cada bloque dentro del bloque externo principal.
Estructura de bloque anidado
Un bloque se puede anidar en otro bloque. Esto puede anidarse ya sea en la parte de ejecución o en la manejo de excepciones parte. Estos bloques también se pueden etiquetar. Un bloque exterior puede contener muchos bloques interiores. Cada bloque interior vuelve a ser un Bloque PL / SQL, por lo tanto, todas las propiedades y características del bloque interior serán las mismas que las del bloque exterior. La siguiente imagen muestra la representación pictórica de la estructura de bloques anidados. El bloque principal es el bloque principal y el bloque secundario es el bloque anidado.
A continuación se muestra la sintaxis del bloque anidado.
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" y "inner_block".
Ámbitos en bloque anidado: ámbito variable
En el bloque anidado, es necesario comprender claramente el alcance y la visibilidad de cada bloque antes de usarlos. Particularmente en el bloque interior, los elementos tanto del bloque exterior como del interior serán visibles, por lo que es necesaria una comprensión adecuada de esto.
Los siguientes puntos resumirán más sobre los alcances en bloques anidados.
- Los elementos declarados en el bloque externo y el valor definido antes de la definición del bloque interno son visibles dentro del bloque interno.
- Los elementos declarados en el bloque interior no son visibles en el bloque exterior. Son visibles sólo dentro del bloque interior.
- El bloque exterior y el bloque interior pueden tener una variable con el mismo nombre.
- En el caso de variables con el mismo nombre, bloque interno de forma predeterminada, se referirá únicamente a la variable declarada en el bloque interno.
- Si el bloque interno quiere hacer referencia a la variable del bloque externo que tiene el mismo nombre que el del bloque interno, entonces el bloque externo debe estar ETIQUETADO y la variable del bloque externo puede denominarse ".".
El siguiente ejemplo le ayudará a comprender más acerca de estos ámbitos.
Ejemplo : En este ejemplo, veremos el alcance de las variables en el bloque interno y externo. Además, veremos cómo referir las variables usando la etiqueta de bloque.
<<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; /
Explicación del código:
- Línea de código 1: Etiquetar el bloque exterior como "OUTER_BLOCK".
- Línea de código 3: Declarar una variable 'var1' como VARCHAR2 (30) con el valor inicial de "bloque externo".
- Línea de código 4: Declarar una variable 'var2' como VARCHAR2 (30) con el valor inicial de "valor antes del bloque interno".
- Línea de código 6: Etiquetar el bloque interior como "INNER_BLOCK"
- Línea de código 8: Declarar una variable 'var1' en el bloque interno como VARCHAR2 (30) con el valor inicial de "bloque interno".
- Línea de código 10: Imprimiendo el valor de 'var1'. Dado que no se menciona ninguna etiqueta de forma predeterminada, tomará el valor de un bloque interno, por lo que se imprimirá el mensaje "inner_block".
- Línea de código 11: Imprimiendo el valor de la variable del bloque externo 'var1'. Dado que el bloque interno tiene la variable con el mismo nombre, debemos hacer referencia a la etiqueta del bloque externo. Imprimiendo así el mensaje 'bloque exterior'.
- Línea de código 12: Imprimiendo el valor de la variable del bloque externo 'var2'. Dado que no hay ninguna variable con este nombre presente en el bloque interno, de forma predeterminada tomará el valor de un bloque externo, por lo que imprimirá el mensaje "valor antes del bloque interno".
- A la variable 'var2' en el bloque externo se le ha asignado el valor 'valor después del bloque interno'. Pero esta asignación se produjo después de la definición de un bloque interno. Por lo tanto, este valor no está presente en el bloque interno.
Ejemplo :En este ejemplo, vamos a encontrar la diferencia entre dos números, uno declarado en el bloque externo y otro en el bloque interno. Ambos tendrán el mismo nombre. Veamos cómo la etiqueta del bloque es útil para hacer referencia a estas variables.
<<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; /
Explicación del código:
- Línea de código 1: Etiquetar el bloque exterior como "OUTER_BLOCK".
- Línea de código 3: Declarar una variable 'ln_val' como NÚMERO con el valor inicial de "5".
- Línea de código 5: Etiquetar el bloque interior como "INNER_BLOCK"
- Línea de código 7: Declarar una variable 'ln_val' en el bloque interno como NÚMERO con el valor inicial de "3".
- Línea de código 9: Imprimiendo la diferencia en el valor de 'ln_val' del bloque exterior e interior. El formato “.” se utiliza para hacer referencia a estas variables para evitar conflictos debido al mismo nombre de variable.
Resumen
En este tutorial, hemos aprendido cómo crear un bloque anidado y cómo manejar el alcance en el bloque interno y externo. También hemos visto un ejemplo en el que las variables del bloque interior y exterior estaban referidas dentro del bloque interior.