FOR
FOR ステートメントは SQL スクリプトで使用され、クエリまたはカーソルをループします。FOR ステートメントには 2 つの形式があります。
構文 1
クエリ式をループするために使用されます。
[<label>:]
FOR <loopVariable> AS [<cursorName> CURSOR FOR]
<queryExpression> DO
<statements>
END FOR [<label>]
構文 2
カーソルを横切るループに使用されます。詳細は、「DECLARE CURSOR 型変数」を参照してください。
[<label>:]
FOR <loopVariable> AS <cursorVariable> DO
<statements>
END FOR [<label>]
備考
|
•
|
<label> は、ブロックに名前を付けるオプションの識別子です。これは、LEAVE および ITERATE ステートメントで使用するためのものです。「LEAVE」と「ITERATE」を参照してください。 |
|
•
|
開始ラベルが存在する場合、終了ラベルは必要ありません。開始ラベルがない場合、終了ラベルを持つことはできません。開始ラベルと終了ラベルの両方が存在する場合、両方が同じ識別子を持つ必要があります。 |
|
•
|
<statements> エリアには、0 個以上のステートメントを含めることができます。 |
|
•
|
FOR ステートメントは、ループ変数がクエリ式 (ROW) と一致する適切な型であることを宣言します。その変数を別の場所で宣言する必要はありません。変数は、ループ ブロック内でのみ有効です。この変数は、現在のスコープ (または親スコープ) 内の別の変数と同じ名前を持つことができますが、プロシージャへのパラメーターと同じ名前を持つことはできません。同じ名前の場合は、複合ステートメントで変数を宣言する場合と同じ規則が適用されます。詳細については、「複合ステートメント」を参照してください。 |
|
•
|
カーソル変数が最初の形式 (構文 1) で指定されている場合は、この時点でも宣言されます。個別に宣言しません。この変数は、指定されたクエリ式のカーソルとして設定されます。 |
|
•
|
カーソルは開始時に開かれます。カーソルを開く必要はありません。次に、行を 1 つずつフェッチし (FETCH を使用)、その行をループ変数に割り当てます。これにより、各行を一度に 1 つずつ操作できます。ループが終了すると、カーソルは自動的に閉じられます。「FETCH」を参照してください。 |
カーソルを開くと (さらに数行をフェッチすると)、FOR ループはカーソルのある場所をピックアップします。カーソルを開かない場合、FOR ステートメントがカーソルを開きます。
FOR ループは、ループがどのように終了しても (LEAVE ステートメントを使用している場合でも) カーソルを閉じます。
|
•
|
FOR ループにカーソルが渡されると、カーソルがまだ開いていない場合は開きます。 |
|
•
|
FOR ループの後、カーソルは閉じられます。FOR ループを LEAVE しようとしても、カーソルは閉じられます。FOR ループで使用されたカーソルをクローズしようとすると、エラーが発生します。 |
例
--Returns the average of all scores
PROCEDURE avr_score (OUT result INTEGER)
BEGIN
DECLARE crs CURSOR FOR
SELECT name, score FROM /shared/U ORDER BY score DESC;
DECLARE total INTEGER DEFAULT 0;
DECLARE cnt INTEGER DEFAULT 0;
OPEN crs;
FOR r AS crs DO
SET total = total + r.score;
SET cnt = cnt + 1;
END FOR;
SET result = total/cnt;
END