PL/SQL変数のスコープと内部外部ブロック: ネスト構造

ネストされたブロックとは Oracle?

PL/SQL では、各ブロックを別のブロックにネストできます。 これらはネストされたブロックと呼ばれます。 ネストされたブロックは、特定のプロセスを実行するときに非常に一般的であり、同時にこれらのプロセスのコードを別のコンテナー (ブロック) に保持する必要があります。

ネストされたブロックの概念は、複雑なものを各ブロックに分離し、メインの外側のブロック内で各ブロックの例外を処理することで、プログラマーが読みやすさを向上させるのに役立ちます。

入れ子になったブロック構造

ブロックは別のブロックにネストできます。 これは、実行部分または 例外処理 一部。 これらのブロックにはラベルを付けることもできます。 XNUMX つの外側ブロックには多数の内側ブロックを含めることができます。 それぞれの内側のブロックは再び PL/SQLブロックしたがって、内側のブロックのすべてのプロパティと特性は外側のブロックと同じになります。 以下の図は、ネストされたブロック構造を図で表したものです。 親ブロックはメイン ブロック、子ブロックはネストされたブロックです。

入れ子になったブロック構造

以下は、ネストされたブロックの構文です。

入れ子になったブロック構造

ネストされたブロック構文

<<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;
  • 上記の構文は、合計 XNUMX つのブロックを含むネストされたブロックを示しています。
  • これらのブロックには「outer_block」および「inner_block」というラベルが付けられます。

ネストされたブロックのスコープ: 変数スコープ

ネストされたブロックでは、各ブロックを使用する前に、各ブロックの範囲と可視性を明確に理解する必要があります。 特に内側のブロックでは、外側のブロックと内側のブロックの両方の要素が表示されるため、これを適切に理解する必要があります。

以下のポイントでは、ネストされたブロック内のスコープについてさらに詳しく説明します。

  • 外側のブロックで宣言された要素と、内側のブロック定義より前に定義された値は、内側のブロック内で表示されます。
  • 内側のブロックで宣言された要素は、外側のブロックでは表示されません。 これらは内側のブロック内でのみ表示されます。
  • 外側のブロックと内側のブロックには同じ名前の変数を含めることができます。
  • 同じ名前の変数の場合、デフォルトでは、内部ブロックは内部ブロックで宣言された変数のみを参照します。
  • 内側のブロックが内側のブロックと同じ名前を持つ外側のブロック変数を参照したい場合は、外側のブロックを LABELLED にする必要があり、外側のブロック変数は ' として参照できます。 。 '

以下の例は、これらのスコープについてさらに理解するのに役立ちます。

: この例では、内側と外側のブロック内の変数のスコープを確認します。 また、ブロックラベルを使用して変数を参照する方法も見ていきます。

ネストされたブロックのスコープ

<<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;
/

コードの説明:

  • コード行 1: 外側のブロックに「OUTER_BLOCK」というラベルを付けます。
  • コード行 3: 変数 'var1' を VARCHAR2 (30) として宣言し、初期値を "outer block" に設定します。
  • コード行 4: 変数 'var2' を VARCHAR2 (30) として宣言し、初期値は「内部ブロックの前の値」です。
  • コード行 6: 内側のブロックに「INNER_BLOCK」というラベルを付ける
  • コード行 8: 内部ブロック内の変数 'var1' を、初期値「内部ブロック」を持つ VARCHAR2 (30) として宣言します。
  • コード行 10: 「var1」の値を出力します。 デフォルトではラベルが指定されていないため、内部ブロックから値を取得し、「inner_block」メッセージを出力します。
  • コード行 11: 外側のブロック変数 'var1' の値を出力します。 内側のブロックには同名の変数があるため、外側のブロックのラベルを参照する必要があります。 したがって、「外側のブロック」というメッセージが出力されます。
  • コード行 12: 外側のブロック変数 'var2' の値を出力します。 内部ブロックにはこの名前の変数が存在しないため、デフォルトでは外部ブロックから値を取得するため、「内部ブロックの前の値」メッセージが出力されます。
  • 外側のブロックの変数 'var2' には、値 '内側のブロックの後の値' が割り当てられています。 ただし、この割り当ては内部ブロックの定義後に行われます。 したがって、この値は内部ブロックには存在しません。

この例では、外側のブロックで宣言された数値と内側のブロックで宣言された数値の差を求めます。どちらも同じ名前を持ちます。ブロック ラベルがこれらの変数を参照する際にどのように役立つかを見てみましょう。

ネストされたブロックのスコープ

<<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;
/

コードの説明:

  • コード行 1: 外側のブロックに「OUTER_BLOCK」というラベルを付けます。
  • コード行 3: 変数「ln_val」を初期値「5」の NUMBER として宣言します。
  • コード行 5: 内側のブロックに「INNER_BLOCK」というラベルを付ける
  • コード行 7: 内部ブロック内の変数「ln_val」を初期値「3」の NUMBER として宣言します。
  • コード行 9: 外側のブロックと内側のブロックからの「ln_val」の値の差を出力します。 ” 。 」形式は、同じ変数名による競合を避けるために、これらの変数を参照するために使用されます。

まとめ

このチュートリアルでは、ネストされたブロックを作成する方法と、内側のブロックと外側のブロックでスコープを処理する方法を学びました。 また、内側と外側のブロックの変数が内側のブロック内で参照される例も見てきました。