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 キーワードを追加します。 アトミック・コンパウンド・ステートメント内のステートメントの実行時にエラーが発生した場合は、 そのコンパウンド・ステートメント全体がロールバックされます。