SQL プロシージャーの FOR ステートメント

FOR ステートメントは、特殊なタイプのループ・ステートメントです。なぜなら、定義済みの読み取り専用の結果セット内の行に対する反復操作を行うのに使用されるからです。

FOR ステートメントを実行すると、FOR ループの反復ごとに、次の行が取り出された場合はその行が結果セットになるように、カーソルが暗黙で宣言されます。 結果セット内に行がなくなるまで、ループは続行されます。

FOR ステートメントによって、カーソルのインプリメンテーションが単純化され、論理操作の実行対象になりうる一連の行の一連の列値を簡単に検索できるようになります。

単純な FOR ステートメントのみを使用した SQL プロシージャーの例を以下に示します。
  CREATE PROCEDURE P()
  LANGUAGE SQL
  BEGIN ATOMIC
    DECLARE fullname CHAR(40);
   
    FOR v AS cur1 CURSOR FOR 
                SELECT firstnme, midinit, lastname FROM employee
    DO 
      SET fullname = v.lastname || ',' || v.firstnme 
                     ||' ' || v.midinit;
      INSERT INTO tnames VALUES (fullname);
    END FOR;
  END

注: CONCAT 関数を使用すれば、この例に示されているような論理を簡単にインプリメントすることができます。 構文を分かりやすく説明するために、例は単純化されています。

for-loop-name は、FOR ステートメントをインプリメントするために生成される暗黙のコンパウンド・ステートメントのラベルを指定します。 その場合、コンパウンド・ステートメントのラベルの規則が守られます。 for-loop-name を使用して、SELECT ステートメントから戻された結果セット内の列名を修飾することができます。

cursor-name は、結果セットから行を選択するときに使用されるカーソルに名前を付けるだけです。 これを指定しないと、Db2® データベース・マネージャーによって自動的に固有なカーソル名が内部で生成されます。

SELECT ステートメントの列名は固有名でなければならず、1 つの表 (JOIN または UNION を行う場合は複数の表) を指定する FROM 節がなければなりません。 参照される表および列は、ループの実行より前に存在している必要があります。 グローバル一時表および宣言済み一時表を参照することができます。

位置指定の更新と削除、および検索済み更新と削除は、FOR ループ中でサポートされます。 確実に正しい結果を得るには、FOR ループのカーソル指定に FOR UPDATE 節を含めてください。

FOR ステートメントのサポートのために作成されたカーソルを、FOR ループ外で参照することはできません。