Portée variable PL/SQL et bloc externe interne : structure imbriquée

⚡ Résumé intelligent

En PL/SQL, les blocs imbriqués permettent de placer un bloc à l'intérieur d'un autre, ce qui facilite la séparation des logiques complexes et l'isolation de la gestion des exceptions. La compréhension de la portée des variables entre les blocs externes et internes, ainsi que l'utilisation d'étiquettes de blocs, garantissent l'absence d'ambiguïté entre les variables portant le même nom.

  • 🧱 Bloc imbriqué : Un bloc imbriqué est un bloc PL/SQL placé à l'intérieur de la section d'exécution ou d'exception d'un autre bloc.
  • 🌳 Extérieur et intérieur : Un bloc externe, ou parent, peut contenir plusieurs blocs internes, ou enfants, chacun étant un bloc PL/SQL complet.
  • 👁️ Portée variable : Les variables d'un bloc extérieur déclarées avant un bloc intérieur sont visibles à l'intérieur de celui-ci, mais les variables d'un bloc intérieur ne sont pas visibles à l'extérieur.
  • 🏷️ Étiquettes des blocs : L'étiquetage du bloc extérieur permet au bloc intérieur de faire référence à une variable extérieure portant le même nom que label.variable_name.
  • 🛡️ Isolation des exceptions : L'imbrication permet à chaque bloc de gérer ses propres exceptions, gardeping Gestion des erreurs au plus près du code qui les génère.
  • 🤖 Assistance IA : Les assistants IA tels que GitHub Copilot étiquetent les blocs imbriqués et signalent les conflits de portée des variables.

Portée des variables PL/SQL à travers des blocs internes et externes imbriqués

Qu'est-ce que les blocs imbriqués Oracle?

In PL / SQLChaque bloc peut être imbriqué dans un autre. Un tel bloc est appelé un bloc imbriqué. Les blocs imbriqués sont très courants lorsque vous souhaitez effectuer un certain processus tout en conservant…ping le code de ce processus dans un conteneur séparé (bloc).

Le concept de blocs imbriqués aide le programmeur à améliorer la lisibilité en séparant la logique complexe en blocs individuels, et il permet exception pour chaque bloc à traiter à l'intérieur du bloc extérieur principal.

Structure de blocs imbriqués

Un bloc peut être imbriqué dans un autre. Il peut être imbriqué soit dans la partie d'exécution, soit dans la partie de gestion des exceptions, et ces blocs peuvent également être étiquetés. Un bloc externe peut contenir plusieurs blocs internes. Chaque bloc interne est lui-même un Bloc PL/SQLAinsi, toutes les propriétés et caractéristiques du bloc interne sont identiques à celles du bloc externe. Le bloc parent est le bloc principal, et le bloc enfant est le bloc imbriqué.

L'image ci-dessous donne une représentation graphique de la structure de blocs imbriqués, dans laquelle le bloc parent est le bloc principal et le bloc enfant est le bloc imbriqué.

Représentation graphique d'un bloc PL/SQL imbriqué avec un bloc parent externe et un bloc enfant interne

Voici la syntaxe du bloc imbriqué. La capture d'écran ci-dessous illustre cette syntaxe, avec ses blocs externe et interne clairement identifiés.

Syntaxe des blocs imbriqués montrant des blocs externes et internes étiquetés, chacun comportant des sections DECLARE, BEGIN et EXCEPTION.

Syntaxe des blocs imbriqués

<<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 syntaxe ci-dessus montre le bloc imbriqué qui contient un total de deux blocs.
  • Ces blocs sont étiquetés « outer_block » et « inner_block ».

Portées dans un bloc imbriqué : portée variable

Dans un bloc imbriqué, il est essentiel de bien comprendre la portée et la visibilité de chaque bloc avant de les utiliser. En particulier, dans le bloc interne, les éléments des blocs externe et interne sont visibles ; il est donc important de bien comprendre ce fonctionnement.

Les points ci-dessous résument les portées dans les blocs imbriqués.

  • Les éléments déclarés dans le bloc extérieur, ainsi que la valeur définie avant la définition du bloc intérieur, sont visibles à l'intérieur du bloc intérieur.
  • Les éléments déclarés dans le bloc interne ne sont pas visibles dans le bloc externe. Ils ne sont visibles qu'à l'intérieur du bloc interne.
  • Le bloc extérieur et le bloc intérieur peuvent avoir un variable avec le même nom.
  • Dans le cas de variables portant le même nom, le bloc interne fait par défaut référence uniquement à la variable déclarée dans ce bloc interne.
  • Si le bloc interne souhaite faire référence à la variable du bloc externe qui porte le même nom que la variable du bloc interne, alors le bloc externe doit être étiqueté, et la variable du bloc externe peut être référencée comme ' . '.

L'exemple ci-dessous vous aidera à mieux comprendre ces portées.

Exemple 1: Cet exemple illustre la portée des variables dans les blocs interne et externe. Il montre également comment y faire référence à l'aide d'une étiquette de bloc.

La capture d'écran ci-dessous illustre l'exemple 1, où le bloc interne fait référence à une variable de bloc externe à l'aide de l'étiquette du bloc.

Exemple de portée de variable dans des blocs imbriqués faisant référence à une variable du bloc externe par son étiquette de bloc

<<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 Explication:

  • Code ligne 1: Nommer le bloc extérieur « OUTER_BLOCK ».
  • Code ligne 3: Déclaration d'une variable 'var1' comme VARCHAR2 (30) avec la valeur initiale de «outer_block».
  • Code ligne 4: Déclaration d'une variable 'var2' comme VARCHAR2 (30) avec la valeur initiale de « valeur avant bloc interne ».
  • Code ligne 6: Nommer le bloc intérieur « INNER_BLOCK ».
  • Code ligne 8: Déclarer une variable 'var1' dans le bloc interne comme VARCHAR2 (30) avec la valeur initiale de « inner_block ».
  • Code ligne 10: Affichage de la valeur de « var1 ». Comme aucune étiquette n'est spécifiée, la valeur par défaut est celle du bloc interne, d'où l'affichage du message « inner_block ».
  • Code ligne 11: Affichage de la valeur de la variable « var1 » du bloc externe. Le bloc interne possédant une variable du même nom, nous faisons référence à l'étiquette du bloc externe. Le message « outer_block » s'affiche donc.
  • Code ligne 12: Affichage de la valeur de la variable « var2 » du bloc externe. Comme aucune variable de ce nom n'existe dans le bloc interne, la valeur par défaut est celle du bloc externe, d'où l'affichage du message « valeur avant le bloc interne ».
  • La variable « var2 » du bloc externe se voit attribuer la valeur « valeur après le bloc interne ». Cependant, cette attribution a lieu après la définition du bloc interne ; par conséquent, cette valeur n'est pas présente à l'intérieur de ce dernier.

Exemple 2: Dans cet exemple, nous calculons la différence entre deux nombres, l'un déclaré dans le bloc extérieur et l'autre dans le bloc intérieur. Ils portent le même nom. Voyons comment l'étiquette du bloc permet de faire référence à ces variables.

La capture d'écran ci-dessous montre l'exemple 2, qui calcule la différence entre les variables de bloc externe et interne portant le même nom.

Exemple de calcul de la différence entre les variables de bloc externe et interne de même nom à l'aide des étiquettes de bloc

<<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 Explication:

  • Code ligne 1: Nommer le bloc extérieur « OUTER_BLOCK ».
  • Code ligne 3: Déclaration d'une variable 'ln_val' de type NUMBER avec la valeur initiale « 5 ».
  • Code ligne 5: Nommer le bloc intérieur « INNER_BLOCK ».
  • Code ligne 7: Déclarer une variable 'ln_val' dans le bloc interne comme NUMBER avec la valeur initiale « 3 ».
  • Code ligne 9: Affichage de la différence de valeur de 'ln_val' entre le bloc externe et le bloc interne. Le « . Le format « » est utilisé pour faire référence à ces variables afin d’éviter les conflits dus à des noms de variables identiques.

FAQ

Un bloc imbriqué est un bloc anonyme placé à l'intérieur d'un autre bloc et qui s'exécute en ligne à l'endroit où il apparaît. sous-programme (procédure ou fonction) est une unité nommée et réutilisable, stockée séparément et appelée par son nom, éventuellement avec des paramètres.

Chaque bloc peut avoir sa propre section EXCEPTION. Une exception levée dans le bloc interne est d'abord gérée par ce bloc ; si elle n'est pas gérée, elle est propagée au gestionnaire du bloc externe englobant. Cela permet d'isoler la gestion des erreurs pour chaque bloc.

PL/SQL n'impose pas de limite fixe, ce qui permet d'imbriquer les blocs sur de nombreux niveaux. En pratique, une imbrication profonde nuit à la lisibilité ; c'est pourquoi la plupart des codes se limitent à deux ou trois niveaux d'imbrication et déplacent la logique réutilisable dans des sous-programmes.

Une étiquette de bloc, écrite entre doubles chevrons avant DECLARE, nomme un bloc. Les étiquettes permettent au code interne de qualifier une variable externe sous la forme étiquette.nom_de_la_variable et peuvent également servir de cibles GOTO, ce qui facilite la lecture et la documentation du code imbriqué.

Oui. Un bloc imbriqué peut apparaître partout où une instruction exécutable est autorisée, y compris à l'intérieur d'une boucle, d'une condition IF ou du corps d'une procédure. Cela permet de limiter la portée des déclarations et de la gestion des exceptions à la seule partie du code qui en a besoin.

L'imbrication est principalement un outil de structuration à la compilation et n'entraîne pas de surcharge significative à l'exécution. Elle améliore la lisibilité et l'isolation des erreurs. Une imbrication trop profonde nuit surtout à la maintenabilité plutôt qu'aux performances brutes.

Oui. Copilote GitHub brouillons étiquetés blocs extérieurs et intérieurs, y compris les sections DÉCLARER, DÉBUT et EXCEPTION, à partir d'un commentaire. RevVérifiez les étiquettes des blocs et la portée des variables afin que les variables internes et externes portant le même nom soient résolues comme prévu.

Les assistants IA analysent les blocs imbriqués et signalent les variables masquées, les références non qualifiées et les accès hors contexte. Cette analyse par apprentissage automatique met en évidence les cas où un bloc interne utilise silencieusement une variable portant le même nom avant l'exécution du code.

Résumez cet article avec :