SQL プロシージャー内のコンパウンド・ステートメントと変数の有効範囲

コンパウンド・ステートメントを使用して新しいスコープを導入します。そのスコープの中では、変数が使用できる場合も使用できない場合もあります。

SQL プロシージャーには 1 つ以上のコンパウンド・ステートメントを含めることができます。 それらは順次導入したり、別のコンパウンド・ステートメントの中にネストしたりできます。

コンパウンド・ステートメント内で宣言される変数を修飾し、固有に識別するためにラベルを使用できます。 このため、コンパウンド・ステートメントを識別するラベルを使用するのは大切なことです。 別のコンパウンド・ステートメントまたはネストされたコンパウンド・ステートメントの変数を参照する場合にはこれは特に重要になります。

以下の例には、 変数 a の 2 つの宣言があります。 1 つのインスタンスは、 lab1 というラベルの付いた外側のコンパウンド・ステートメント内の宣言であり、 もう 1 つのインスタンスは、 lab2 というラベルの付いた内側のコンパウンド・ステートメント内の宣言です。 この記述のとおり、代入ステートメント内の a の参照先は、lab2 というラベルの付いたコンパウンド・ブロックのローカル有効範囲内の宣言であると Db2® は判断します。 しかし、変数 a によって、lab1 というラベルの付いたコンパウンド・ステートメント・ブロック内の宣言を参照する場合は、そのコンパウンド・ブロック内の宣言を正しく参照するために、変数をそのブロックのラベルで修飾する必要があります。 つまり、lab1.a というふうに修飾するということです。


  CREATE PROCEDURE P1 ()
  LANGUAGE SQL
    lab1: BEGIN
      DECLARE a INT DEFAULT 100;
      lab2: BEGIN
        DECLARE a INT DEFAULT NULL;

        SET a = a + lab1.a;

        UPDATE T1
         SET T1.b = 5 
          WHERE T1.b = a;  <-- Variable a refers to lab2.a 
                               unless qualified otherwise

      END lab2;
   END lab1

SQL プロシージャー内の最も外側のコンパウンド・ステートメントをアトミックとして宣言できます。 そのためには、BEGIN キーワードの後に ATOMIC キーワードを追加します。 アトミック・コンパウンド・ステートメント内のステートメントの実行時にエラーが発生した場合は、 そのコンパウンド・ステートメント全体がロールバックされます。