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.

  • ๐Ÿงฑ Bloque anidado: Un bloque anidado es un bloque PL/SQL colocado dentro de la secciรณn de ejecuciรณn o de excepciones de otro bloque.
  • ???? Exterior e interior: Un bloque externo, o padre, puede contener muchos bloques internos, o hijos, cada uno de los cuales es un bloque PL/SQL completo.
  • ๐Ÿ‘๏ธ รmbito de las variables: Las variables de un bloque externo que se declaran antes de un bloque interno son visibles dentro de este, pero las variables de un bloque interno no son visibles fuera de รฉl.
  • ๐Ÿท๏ธ Etiquetas de bloque: Al etiquetar el bloque exterior, el bloque interior puede hacer referencia a una variable exterior con el mismo nombre que label.variable_name.
  • ๐Ÿ›ก๏ธ Aislamiento de excepciones: El anidamiento permite que cada bloque gestione sus propias excepciones,ping Manejo de errores cerca del cรณdigo que lo genera.
  • ๐Ÿค– Asistencia de IA: Los asistentes de IA, como GitHub Copilot, redactan bloques anidados etiquetados y seรฑalan conflictos de รกmbito de variables.

รmbito de las variables PL/SQL en bloques internos y externos anidados

ยฟ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.

Representaciรณn grรกfica de un bloque anidado PL/SQL con un bloque padre externo y un bloque hijo interno.

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 bloques anidados que muestra bloques externos e internos etiquetados, cada uno con secciones DECLARE, BEGIN y EXCEPTION.

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.

Ejemplo de รกmbito de variable en bloques anidados que hace referencia a una variable de bloque externo mediante su etiqueta de 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.

Ejemplo de cรกlculo de la diferencia entre variables de bloque externas e internas con el mismo nombre utilizando etiquetas de bloque.

<<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.

Preguntas Frecuentes

Un bloque anidado es un bloque anรณnimo colocado dentro de otro bloque y se ejecuta en lรญnea donde aparece. subprograma (Un procedimiento o funciรณn) es una unidad reutilizable con nombre que se almacena por separado y se llama por su nombre, opcionalmente con parรกmetros.

Cada bloque puede tener su propia secciรณn de EXCEPCIONES. Si una excepciรณn se produce en el bloque interno, ese bloque la gestiona primero; si no se gestiona, se propaga al manejador del bloque externo que la contiene. Esto permite aislar el manejo de errores por bloque.

PL/SQL no impone un lรญmite fijo, por lo que los bloques pueden anidarse a muchos niveles de profundidad. En la prรกctica, el anidamiento profundo perjudica la legibilidad, por lo que la mayorรญa del cรณdigo mantiene el anidamiento en dos o tres niveles y traslada la lรณgica reutilizable a subprogramas.

Una etiqueta de bloque, escrita como un nombre entre corchetes angulares dobles antes de DECLARE, nombra un bloque. Las etiquetas permiten que el cรณdigo interno califique una variable externa como etiqueta.nombre_de_variable y tambiรฉn pueden servir como destinos GOTO, lo que facilita la lectura y documentaciรณn del cรณdigo anidado.

Sรญ. Un bloque anidado puede aparecer en cualquier lugar donde se permita una instrucciรณn ejecutable, incluso dentro de un bucle, una bifurcaciรณn IF o el cuerpo de un procedimiento. Esto permite limitar las declaraciones y el manejo de excepciones solo a la parte del cรณdigo que los necesita.

El anidamiento es principalmente una herramienta de estructuraciรณn en tiempo de compilaciรณn y, por sรญ solo, no aรฑade una sobrecarga significativa en tiempo de ejecuciรณn. Mejora la legibilidad y el aislamiento de errores. Un anidamiento profundo excesivo suele perjudicar la mantenibilidad, mรกs que la velocidad.

Sรญ. Copiloto de GitHub Borradores etiquetados como bloques externos e internos, incluidas las secciones DECLARE, BEGIN y EXCEPTION, a partir de un comentario. RevObserve las etiquetas de los bloques y el alcance de las variables para que las variables internas y externas con el mismo nombre se resuelvan como se espera.

Los asistentes de IA analizan bloques anidados y detectan variables ocultas, referencias no cualificadas y accesos fuera de รกmbito. Esta revisiรณn de aprendizaje automรกtico destaca los casos en los que un bloque interno utiliza silenciosamente una variable con el mismo nombre incorrecta antes de que se ejecute el cรณdigo.

Resumir este post con: