PL/SQL-Variablenbereich und innerer äußerer Block: Verschachtelte Struktur

⚡ Intelligente Zusammenfassung

Verschachtelte Blöcke in PL/SQL ermöglichen es, komplexe Logik zu trennen und die Ausnahmebehandlung zu isolieren. Durch das Verständnis des Gültigkeitsbereichs von Variablen zwischen äußeren und inneren Blöcken sowie die Verwendung von Blockbezeichnungen wird sichergestellt, dass gleichnamige Variablen eindeutig sind.

  • 🧱 Verschachtelter Block: Ein verschachtelter Block ist ein PL/SQL-Block, der innerhalb des Ausführungs- oder Ausnahmeabschnitts eines anderen Blocks platziert wird.
  • 🌳 Äußeres und Inneres: Ein äußerer, oder übergeordneter, Block kann viele innere, oder untergeordnete, Blöcke enthalten, von denen jeder ein vollständiger PL/SQL-Block ist.
  • 👁️ Variablenbereich: Variablen, die in einem äußeren Block vor einem inneren Block deklariert werden, sind innerhalb des inneren Blocks sichtbar, Variablen in einem inneren Block sind jedoch außerhalb des inneren Blocks nicht sichtbar.
  • 🏷️ Blockbeschriftungen: Durch die Kennzeichnung des äußeren Blocks kann der innere Block auf eine gleichnamige äußere Variable als label.variable_name verweisen.
  • 🛡️ Ausnahmeisolierung: Durch Verschachtelung kann jeder Block seine eigenen Ausnahmen behandeln.ping Fehlerbehandlung möglichst nahe an dem Code, der den Fehler auslöst.
  • 🤖 KI-Unterstützung: KI-Assistenten wie GitHub Copilot entwerfen gekennzeichnete, verschachtelte Blöcke und markieren Konflikte im Variablenbereich.

PL/SQL-Variablenbereich über verschachtelte innere und äußere Blöcke hinweg

Was sind verschachtelte Blöcke? Oracle?

In PL / SQLJeder Block kann in einem anderen Block verschachtelt werden. Ein solcher Block wird als verschachtelter Block bezeichnet. Verschachtelte Blöcke sind sehr häufig, wenn man einen bestimmten Prozess ausführen möchte, während man gleichzeitig einen anderen Block verwendet.ping Der Code für diesen Prozess befindet sich in einem separaten Container (Block).

Das Konzept der verschachtelten Blöcke hilft dem Programmierer, die Lesbarkeit zu verbessern, indem komplexe Logik in einzelne Blöcke unterteilt wird, und ermöglicht es dem Ausnahme Jeder Block muss innerhalb des äußeren Hauptblocks verarbeitet werden.

Verschachtelte Blockstruktur

Ein Block kann in einem anderen Block verschachtelt werden. Dies kann entweder im Ausführungsteil oder im Ausnahmebehandlungsteil erfolgen, und diese Blöcke können auch beschriftet werden. Ein äußerer Block kann mehrere innere Blöcke enthalten. Jeder innere Block ist selbst ein PL/SQL-BlockDaher sind alle Eigenschaften und Merkmale des inneren Blocks identisch mit denen des äußeren Blocks. Der übergeordnete Block ist der Hauptblock, der untergeordnete Block der darin enthaltene Block.

Die Abbildung unten zeigt eine bildliche Darstellung der verschachtelten Blockstruktur, wobei der übergeordnete Block der Hauptblock und der untergeordnete Block der verschachtelte Block ist.

Bildliche Darstellung eines verschachtelten PL/SQL-Blocks mit einem übergeordneten äußeren Block und einem untergeordneten inneren Block

Nachfolgend finden Sie die Syntax für den verschachtelten Block. Der Screenshot unten zeigt die Syntax des verschachtelten Blocks mit seinen beschrifteten äußeren und inneren Blöcken.

Syntax verschachtelter Blöcke mit beschrifteten äußeren und inneren Blöcken, die jeweils DECLARE-, BEGIN- und EXCEPTION-Abschnitte enthalten.

Syntax verschachtelter Blöcke

<<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;
  • Die obige Syntax zeigt den verschachtelten Block, der insgesamt zwei Blöcke enthält.
  • Diese Blöcke sind als „outer_block“ und „inner_block“ bezeichnet.

Bereiche im verschachtelten Block: Variabler Bereich

In verschachtelten Blöcken ist es wichtig, den Geltungsbereich und die Sichtbarkeit jedes einzelnen Blocks genau zu verstehen, bevor man sie verwendet. Insbesondere im inneren Block sind Elemente sowohl des äußeren als auch des inneren Blocks sichtbar, daher ist ein genaues Verständnis dieser Zusammenhänge unerlässlich.

Die folgenden Punkte fassen die Bereiche in verschachtelten Blöcken zusammen.

  • Die im äußeren Block deklarierten Elemente und der vor der Definition des inneren Blocks festgelegte Wert sind innerhalb des inneren Blocks sichtbar.
  • Die im inneren Block deklarierten Elemente sind im äußeren Block nicht sichtbar. Sie sind nur innerhalb des inneren Blocks sichtbar.
  • Der äußere Block und der innere Block können jeweils einen haben. Variable mit dem gleichen Namen.
  • Bei Variablen mit gleichem Namen bezieht sich der innere Block standardmäßig nur auf die im inneren Block deklarierte Variable.
  • Wenn der innere Block auf eine Variable des äußeren Blocks verweisen möchte, die denselben Namen wie die Variable des inneren Blocks hat, muss der äußere Block mit einem Label versehen werden, und auf die Variable des äußeren Blocks kann dann mit dem Namen „“ verwiesen werden. Die '.

Das folgende Beispiel hilft Ihnen, diese Bereiche besser zu verstehen.

Beispiel 1: In diesem Beispiel sehen wir den Gültigkeitsbereich von Variablen im inneren und äußeren Block. Wir sehen auch, wie man mithilfe einer Blockbezeichnung auf die Variablen zugreift.

Der untenstehende Screenshot zeigt Beispiel 1, in dem der innere Block mithilfe der Blockbezeichnung auf eine Variable des äußeren Blocks verweist.

Beispiel für den Gültigkeitsbereich einer Variable in verschachtelten Blöcken, wobei auf eine Variable eines äußeren Blocks über deren Blockbezeichnung verwiesen wird.

<<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 Erläuterung:

  • Code Zeile 1: Der äußere Block wird als „OUTER_BLOCK“ bezeichnet.
  • Code Zeile 3: Deklaration einer Variablen 'var1' als VARCHAR2 (30) mit dem Anfangswert "outer_block".
  • Code Zeile 4: Deklaration einer Variablen 'var2' als VARCHAR2 (30) mit dem Anfangswert „Wert vor innerem Block“.
  • Code Zeile 6: Der innere Block wird als „INNER_BLOCK“ bezeichnet.
  • Code Zeile 8: Deklaration einer Variablen 'var1' im inneren Block als VARCHAR2 (30) mit dem Anfangswert "inner_block".
  • Code Zeile 10: Der Wert von 'var1' wird ausgegeben. Da keine Bezeichnung angegeben ist, wird standardmäßig der Wert aus dem inneren Block verwendet, wodurch die Meldung 'inner_block' ausgegeben wird.
  • Code Zeile 11: Der Wert der äußeren Blockvariable 'var1' wird ausgegeben. Da der innere Block eine Variable mit demselben Namen besitzt, wird auf die Bezeichnung des äußeren Blocks verwiesen. Daher wird die Meldung 'outer_block' ausgegeben.
  • Code Zeile 12: Der Wert der äußeren Blockvariable 'var2' wird ausgegeben. Da im inneren Block keine Variable mit diesem Namen existiert, wird standardmäßig der Wert aus dem äußeren Block verwendet, weshalb die Meldung 'Wert vor innerem Block' ausgegeben wird.
  • Der Variablen 'var2' im äußeren Block wird der Wert 'Wert nach dem inneren Block' zugewiesen. Diese Zuweisung erfolgt jedoch nach der Definition des inneren Blocks, sodass dieser Wert im inneren Block nicht vorhanden ist.

Beispiel 2: In diesem Beispiel berechnen wir die Differenz zweier Zahlen, eine im äußeren und die andere im inneren Block. Beide haben denselben Namen. Wir sehen uns an, wie die Blockbezeichnung beim Verweisen auf diese Variablen hilfreich ist.

Der untenstehende Screenshot zeigt Beispiel 2, das die Differenz zwischen den äußeren und inneren Blockvariablen mit demselben Namen berechnet.

Beispiel zur Berechnung der Differenz zwischen äußeren und inneren Blockvariablen gleichen Namens mithilfe von Blockbezeichnungen

<<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 Erläuterung:

  • Code Zeile 1: Der äußere Block wird als „OUTER_BLOCK“ bezeichnet.
  • Code Zeile 3: Deklaration einer Variablen 'ln_val' vom Typ NUMBER mit dem Anfangswert „5“.
  • Code Zeile 5: Der innere Block wird als „INNER_BLOCK“ bezeichnet.
  • Code Zeile 7: Deklaration einer Variablen 'ln_val' im inneren Block als NUMBER mit dem Anfangswert „3“.
  • Code Zeile 9: Die Differenz des Wertes von 'ln_val' aus dem äußeren und inneren Block ausgeben. Die Das Format " wird verwendet, um auf diese Variablen zu verweisen und Konflikte aufgrund gleicher Variablennamen zu vermeiden.

Häufig gestellte Fragen

Ein verschachtelter Block ist ein anonymer Block, der innerhalb eines anderen Blocks platziert wird und dort inline ausgeführt wird, wo er erscheint. Unterprogramm (Prozedur oder Funktion) ist eine benannte, wiederverwendbare Einheit, die separat gespeichert und über ihren Namen aufgerufen wird, optional mit Parametern.

Jeder Block kann einen eigenen EXCEPTION-Abschnitt haben. Eine im inneren Block ausgelöste Ausnahme wird zuerst von diesem Block behandelt; bleibt sie unbehandelt, wird sie an den Handler des umschließenden äußeren Blocks weitergegeben. Dadurch lässt sich die Fehlerbehandlung blockweise isolieren.

PL/SQL kennt keine feste Verschachtelungsgrenze, daher können Blöcke viele Ebenen tief verschachtelt werden. In der Praxis verschlechtert eine tiefe Verschachtelung jedoch die Lesbarkeit, weshalb die meisten Codeabschnitte auf zwei oder drei Ebenen beschränkt bleiben und wiederverwendbare Logik in Unterprogramme auslagern.

Eine Blockbezeichnung, die als Name in doppelten spitzen Klammern vor DECLARE geschrieben wird, benennt einen Block. Bezeichnungen ermöglichen es, dass innerer Code eine äußere Variable als Bezeichnung.Variablenname qualifiziert und können auch als GOTO-Ziele dienen, wodurch verschachtelter Code leichter lesbar und dokumentierbar wird.

Ja. Ein verschachtelter Block kann überall dort vorkommen, wo eine ausführbare Anweisung zulässig ist, also innerhalb einer Schleife, eines IF-Zweigs oder des Rumpfs einer Prozedur. Dadurch können Sie Deklarationen und Ausnahmebehandlungen auf den Teil des Codes beschränken, der sie benötigt.

Verschachtelung ist hauptsächlich ein Werkzeug zur Strukturierung des Codes zur Kompilierzeit und verursacht an sich keinen nennenswerten Laufzeit-Overhead. Sie verbessert die Lesbarkeit und die Fehlerisolierung. Zu tiefe Verschachtelung beeinträchtigt meist eher die Wartbarkeit als die reine Geschwindigkeit.

Ja. GitHub-Copilot Entwürfe mit der Bezeichnung äußere und innere Blöcke, einschließlich der Abschnitte DECLARE, BEGIN und EXCEPTION, aus einem Kommentar. RevBeachten Sie die Blockbezeichnungen und den Variablenbereich, damit gleichnamige innere und äußere Variablen wie gewünscht aufgelöst werden.

KI-Assistenten analysieren verschachtelte Codeblöcke und kennzeichnen verdeckte Variablen, nicht qualifizierte Referenzen und Zugriffe außerhalb des Gültigkeitsbereichs. Diese maschinelle Lernanalyse hebt Stellen hervor, an denen ein innerer Block vor der Codeausführung stillschweigend die falsche, gleichnamige Variable verwendet.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: