Está en la página 1de 32

Programación de bases de datos con PL /

SQL
2-6
Bloques anidados y alcance variable

Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos.


Objetivos
•Esta lección cubre los siguientes objetivos:
-Comprender el alcance y la visibilidad de las variables.
-Escriba bloques anidados y califique variables con etiquetas
-Describir las reglas para el alcance de la variable cuando una variable
está anidada en un bloque.
-Reconocer un problema de alcance variable cuando una variable se usa
en bloques anidados

-Calificar una variable anidada en un bloque con una etiqueta

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 3
Propósito

• Un bloque grande y complejo puede ser difícil de entender


• Puede dividirlo en bloques más pequeños que están anidados uno
dentro del otro, haciendo que el bacalao se lea y corrija
• Cuando anida bloques, es posible que las variables
declaradas no estén disponibles según su alcance y
visibilidad

•Puede hacer que las variables invisibles estén

disponibles mediante el uso de etiquetas de bloque

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 4
Bloques anidados

•PL / SQL es un lenguaje estructurado en bloques


• Las unidades básicas (procedimientos, funciones y anónimas
bloques) son bloques lógicos, que pueden contener cualquier
número de sub-bloques anidados
• Cada bloque lógico corresponde a un problema a resolver

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 5
Bloques anidados ilustrados

•Los bloques anidados son bloques de código colocados dentro de


otros bloques de código

• Hay un bloque exterior y un bloque interior.


•Puede anidar bloques dentro de bloques tantas veces como desee.
Necesitar; No existe un límite práctico para la profundidad
de anidamiento que permite Oracle.

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 6
Ejemplo de bloque anidado

•El ejemplo que se muestra en la diapositiva tiene un bloque externo


(principal) (ilustrado en texto azul) y un bloque anidado (secundario)
(ilustrado en texto rojo)
• La variable v_outer_variable se declara en el bloque exterior y la
variable v_inner_variable se declara en el bloque interior

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 7
Ejemplo de bloque anidado

DECLARE
v_outer_variable VARCHAR2 (20) : = 'VARIABLE GLOBAL’;
BEGIN
DECLARE
v_inner_variable VARCHAR2 (20) : = 'VARIABLE LOCAL’;
BEGIN
DBMS_OUTPUT.PUT_LINE (v_inner_variable);
DBMS_OUTPUT.PUT_LINE (v_outer_variable);
END;
DBMS_OUTPUT.PUT_LINE (v_outer_variable);
END;

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 8
Alcance variable
•El alcance de una variable es el bloque o bloques en los que la variable
es accesible, es decir, donde se puede utilizar.
•En PL / SQL, el alcance de una variable es el bloque en el que se declara
más todos los bloques anidados dentro del bloque declarante

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 9
Alcance variable
•¿Cuáles son los alcances de las dos variables declaradas en este
ejemplo?
DECLARE
v_outer_variable VARCHAR2 (20) : = 'VARIABLE GLOBAL';
BEGIN
DECLARE
v_inner_variable VARCHAR2 (20) : = 'VARIABLE LOCAL';
BEGIN
DBMS_OUTPUT.PUT_LINE (v_inner_variable);
DBMS_OUTPUT.PUT_LINE (v_outer_variable);
END;
DBMS_OUTPUT.PUT_LINE (v_outer_variable);
END;

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 10
Ejemplo de alcance variable

•Examine el siguiente código


•¿Cuál es el alcance de cada una de las variables?
DECLARE
v_father_name VARCHAR2 (20) : = 'Patrick';
v_date_of_birth DATE : = '20-Apr-1972';
BEGIN
DECLARE
v_child_name VARCHAR2 (20): = 'Mike';
BEGIN
DBMS_OUTPUT.PUT_LINE ('Father' 's Name: ' || v_father_name);
DBMS_OUTPUT.PUT_LINE ('Date of Birth: ' || v_date_of_birth);
DBMS_OUTPUT.PUT_LINE ('Child' 's Name: ' || v_name_name);
END;
DBMS_OUTPUT.PUT_LINE ('Date of Birth: ' || v_date_of_birth);
END;

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 11
Variables locales y globales
•Las variables declaradas en un bloque PL / SQL se consideran locales para
ese bloque y globales para todos los bloques anidados dentro
eso
• V_outer_variable es local al bloque externo pero global al bloque
interno
DECLARE
v_outer_variable VARCHAR2(20):='GLOBAL VARIABLE';
BEGIN
DECLARE v_inner_variable VARCHAR2(20):='LOCAL VARIABLE';
BEGIN
DBMS_OUTPUT.PUT_LINE(v_inner_variable);
DBMS_OUTPUT.PUT_LINE(v_outer_variable);
END;
DBMS_OUTPUT.PUT_LINE(v_outer_variable);
END;

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 12
Variables locales y globales
•Cuando accede a esta variable en el bloque interno, PL / SQL primero
busca una variable local en el bloque interno con ese nombre
•Si no hay variables con nombres similares, PL / SQL busca
para la variable en el bloque exterior
DECLARE
v_outer_variable VARCHAR2(20) :='GLOBAL VARIABLE';
BEGIN
DECLARE
v_inner_variable VARCHAR2(20):='LOCAL VARIABLE';
BEGIN
DBMS_OUTPUT.PUT_LINE(v_inner_variable);
DBMS_OUTPUT.PUT_LINE(v_outer_variable);
END;
DBMS_OUTPUT.PUT_LINE(v_outer_variable);
END;

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 13
Variables locales y globales
•La variable v_inner_variable es local al bloque interno y no
es global porque el bloque interno no tiene bloques
anidados
•Solo se puede acceder a esta variable dentro del cuadro
DECLARE
v_outer_variable VARCHAR2(20):='GLOBAL VARIABLE';
BEGIN
DECLARE
v_inner_variable VARCHAR2(20):='LOCAL VARIABLE';
BEGIN
DBMS_OUTPUT.PUT_LINE(v_inner_variable);
DBMS_OUTPUT.PUT_LINE(v_outer_variable);
END;
DBMS_OUTPUT.PUT_LINE(v_outer_variable);
END;

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 14
Variables locales y globales
•Si PL / SQL no encuentra la variable declarada localmente, busca hacia
arriba en la sección declarativa de los bloques principales.

•PL / SQL no mira hacia abajo en los bloques secundarios


DECLARE
v_outer_variable VARCHAR2(20):='GLOBAL VARIABLE';
BEGIN
DECLARE
v_inner_variable VARCHAR2(20):='LOCAL VARIABLE';
BEGIN
DBMS_OUTPUT.PUT_LINE(v_inner_variable);
DBMS_OUTPUT.PUT_LINE(v_outer_variable);
END;
DBMS_OUTPUT.PUT_LINE(v_outer_variable);
END;

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 15
Alcance variable accesible al bloque exterior
•Las variables v_father_name y v_date_of_birth son
declarado en el bloque exterior
•Son locales al bloque exterior y globales al bloque
interior.
•Su alcance incluye ambos bloques
DECLARE
v_father_name VARCHAR2 (20): = 'Patrick';
v_date_of_birth DATE: = '20-Apr-1972 ';
BEGIN
DECLARAR
v_child_name VARCHAR2 (20): = 'Mike';
...

PLSQL 2-6
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. dieciséis
Bloques anidados y alcance variable
Alcance variable accesible al bloque exterior
•La variable v_child_name se declara en el bloque
interno (anidado)
•Esta variable es accesible solo dentro del bloque interno y no es
accesible en el bloque externo

DECLARE
v_father_name VARCHAR2 (20) := 'Patrick ';
v_date_of_birth DATE := '20-Apr-1972';
BEGIN
DECLARE
v_child_name VARCHAR2 (20) := 'Mike';
...

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 17
Un ejemplo de alcance
•¿Por qué este código no funcionará correctamente?
DECLARE
v_first_name VARCHAR2 (20);
BEGIN
DECLARE
v_last_name VARCHAR2 (20);
BEGIN
v_first_name: = 'Carmen';
v_last_name: = 'Miranda';
DBMS_OUTPUT.PUT_LINE
(v_first_name || ' ' || v_last_name);
END;
DBMS_OUTPUT.PUT_LINE
(v_first_name || ' ' || v_last_name);
END;

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 18
Un segundo ejemplo de alcance

•¿Funcionará este código correctamente? ¿Por qué o por qué no?


DECLARE
v_first_name VARCHAR2 (20);
v_last_name VARCHAR2 (20);
BEGIN
BEGIN
v_first_name := 'Carmen';
v_last_name := 'Miranda';
DBMS_OUTPUT.PUT_LINE
(v_first_name || ' ' || v_last_name);
END;
DBMS_OUTPUT.PUT_LINE (v_first_name || ' ' || v_last_name);
END;

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 19
Tres niveles de bloque anidado
•¿Cuál es el alcance de cada una de estas variables?

DECLARE - - bloque exterior


v_outervar VARCHAR2 (20);
BEGIN
- - bloque intermedio
DECLARE
VARCHAR2 (20);
v_middlevar
BEGIN
BEGIN - - bloque interior
v_outervar := 'Joaquin';
v_middlevar := 'Chang';
END;
END;
END;

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 20
Nomenclatura variable

•No puede declarar dos variables con el mismo nombre en el


mismo bloque
•Sin embargo, puede declarar variables con el mismo nombre en dos
bloques diferentes cuando un bloque está anidado
dentro del otro bloque
•Los dos elementos representados por el mismo nombre son
distintos y cualquier cambio en uno no afecta al otro.

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 21
Ejemplo de denominación de variables

•¿Son válidas las siguientes declaraciones?

DECLARE - - bloque exterior


v_myvar VARCHAR2 (20);
BEGIN
DECLARE - - bloque interior
v_myvar VARCHAR2 (15);
BEGIN
...
END;
END;

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 22
Visibilidad variable
•¿Qué pasa si se usa el mismo nombre para dos variables, una en cada uno
de los bloques?

•En este ejemplo, la variable v_date_of_birth se


declara dos veces
DECLARE
v_father_name VARCHAR2(20) := 'Patrick';
v_date_of_birth DATE := '20-Apr-1972';
BEGIN
DECLARE
v_child_name VARCHAR2(20):='Mike';
v_date_of_birth DATE := '12-Dec-2002’;
BEGIN
DBMS_OUTPUT.PUT_LINE('Date of Birth:' || v_date_of_birth);
...
PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 23
Visibilidad variable
•¿A qué v_date_of_birth se hace referencia en la
declaración DBMS_OUTPUT.PUT_LINE?

DECLARE
v_father_name VARCHAR2(20) := 'Patrick';
v_date_of_birth DATE := '20-Apr-1972';
BEGIN
DECLARE
v_child_name VARCHAR2(20) := 'Mike';
v_date_of_birth DATE := '12-Dec-2002’;
BEGIN
DBMS_OUTPUT.PUT_LINE('Date of Birth:' || v_date_of_birth);
...

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 24
Visibilidad variable
•La visibilidad de una variable es la parte del programa donde
se puede acceder a la variable sin usar un calificador
•¿Cuál es la visibilidad de cada una de las variables?
DECLARE
v_father_name VARCHAR2(20):='Patrick';
v_date_of_birth DATE:='20-Apr-1972';
BEGIN
DECLARE
v_child_name VARCHAR2(20):='Mike';
v_date_of_birth DATE:='12-Dec-2002';
BEGIN
1 DBMS_OUTPUT.PUT_LINE('Father' 's Name: ' || v_father_name);
DBMS_OUTPUT.PUT_LINE('Date of Birth: ' || v_date_of_birth);
DBMS_OUTPUT.PUT_LINE('Child''s Name: ' || v_child_name);
END;
2 DBMS_OUTPUT.PUT_LINE('Date of Birth: ' || v_date_of_birth);
END;

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 25
Visibilidad variable
•La variable v_date_of_birth declarada en el bloque
externo tiene alcance incluso en el bloque interno
•Esta variable es visible en el bloque exterior
•Sin embargo, no es visible en el bloque interior porque el
El bloque interno tiene una variable local con el mismo nombre.
DECLARE
v_father_name VARCHAR2(20) := 'CPatrick';
v_date_of_birth DATE := '20-Apr-1972';
BEGIN
DECLARE
v_child_name VARCHAR2(20):='Mike';
v_date_of_birth DATE:='12-Dec-2002';
...

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 26
Visibilidad variable
• La variable v_father_name es visible en los bloques interior y exterior
• La variable v_child_name es visible solo en el bloque interno
•¿Qué sucede si desea hacer referencia a v_date_of_birth del
bloque externo dentro del bloque interno?

DECLARE
v_father_name VARCHAR2(20) := 'Patrick';
v_date_of_birth DATE := '20-Apr-1972';
BEGIN
DECLARE
v_child_name VARCHAR2(20) := 'Mike';
v_date_of_birth DATE := '12-Dec-2002';

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 27
Calificar un identificador
•Un calificador es una etiqueta que se le da a un bloque.
•Puede utilizar este calificador para acceder a las variables que tienen alcance
pero no son visibles
•El bloque exterior a continuación está etiquetado como <<outer>>
<<outer>>
DECLARE
v_father_name VARCHAR2 (20): = 'Patricio';
v_date_of_birth DATE := '20-Apr-1972';
BEGIN
DECLARE
v_child_name VARCHAR2 (20) := 'Mike';
v_date_of_birth DATE := '12-Dec-2002';
...

•Cada bloque interno anidado también se puede etiquetar

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 28
Calificar un identificador
•Usando la etiqueta exterior para calificar el identificador v_date_of_birth, ahora
puede imprimir la fecha de nacimiento del padre usando código en el bloque
interno
<<outer>>
DECLARE Nombre del padre: Patrick Fecha de
v_father_name VARCHAR2(20) := 'Patrick'; nacimiento: 20 de abril de 1972 Nombre
v_date_of_birth DATE := '20-Apr-1972'; del niño: Mike

BEGIN Fecha de nacimiento: 12 de diciembre de 2002

DECLARE
v_child_name VARCHAR2(20):='Mike'; Declaración procesada.
v_date_of_birth DATE:='12-Dec-2002';
BEGIN
DBMS_OUTPUT.PUT_LINE('Father''s Name: ' || v_father_name);
DBMS_OUTPUT.PUT_LINE('Date of Birth: ' || outer.v_date_of_birth);
DBMS_OUTPUT.PUT_LINE('Child''s Name: ' || v_child_name);
DBMS_OUTPUT.PUT_LINE('Date of Birth: ' || v_date_of_birth);
END;
END;

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 29
Terminología
•Los términos clave utilizados en esta lección incluyen:
-Etiqueta de bloque
-Alcance variable
-Visibilidad variable

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 30
Resumen
•En esta lección, debería haber aprendido a:
-Comprender el alcance y la visibilidad de las variables.
-Escriba bloques anidados y califique variables con etiquetas
-Describir las reglas para el alcance de la variable cuando una variable
está anidada en un bloque.
-Reconocer un problema de alcance variable cuando una variable se usa
en bloques anidados

-Calificar una variable anidada en un bloque con una etiqueta

PLSQL 2-6
Bloques anidados y alcance variable
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 31

También podría gustarte