FORループ

FORループは間違いなくPL/pgSQLで実装されている最も重要なループです。 Forループを使用して、指定した整数の範囲でステートメントブロックを反復処理します。 PL/pgSQLのFORループの構造は、Cなどの他の手続き型言語のFORloopsに似ています。

PL/pgSQLのFORループでは、ループの反復を追跡するために整数変数が最初に記述され、次に整数範囲が与えられ、最後に文ブロックが提供されます。 ループの反復処理を実行するために作成された整数変数は、ループが終了すると破棄されます。 FORループの構文を次に示します:

 FOR identifier IN expression1 .. expression2 LOOP statement; END LOOP;

FORループは、expression1とexpression2の間の値の範囲内にあるidentifierのインクリメントされた値ごとに単一の反復を実行します。 識別子の値は、以前の設定に関係なく、式1の値に初期化され、反復ごとに1ずつ増加します。 この場合、識別子はインクリメントされるのではなくデクリメントされます。

注:反復を追跡するために使用される識別子は、ループが終了した後にその値にアクセスできるようにする場合を除き、forブロックの外側で宣言する必

FORループは、クエリの結果を循環させるために使用することもできます。 例11-45のsecond FORループは、AFORループを使用してRECORDおよび%ROWTYPE変数を操作する方法を示しています。 RECORD変数と%ROWTYPE変数を介して処理されるFORループの構文は、次の構文で示されています:

 FOR { record_variable | %rowtype_variable } IN select_statement LOOP statement; END LOOP;

例11-45では、extract_all_titles()関数を使用して、データベースに存在するすべての書籍タイトルのリストを件名別に抽出します。 件名に本のタイトルがない場合は、ablank行が表示されます。 リストはテキスト変数として返されます。 Forループは、extract_all_titles()関数内で使用可能になり、availablesubjectsを番号で循環します。

別のFORループが元のループ内にネストされ、availablebooksを循環させ、元のループのiteration変数と一致するsubject_id値を持つすべてのブックを取得します。 例11-45では、subjectテーブルの最初のsubject ID番号が0であるため、反復変数iはゼロに初期化されます。

例11-46は、AFORループを使用してSQL問合せの結果を反復処理する別の関数のコードを示しています。 ループの反復ごとに、例11-46のFORループは、booksテーブルに対するクエリのaresult行の内容をrow_data変数に配置し、行のtitleフィールドの値をtext_output変数に挿入します。

booksの最後のレコードに到達するとループは終了します。 ループの終わりまでに、text_outputには、関数に渡された件名ID番号に一致するすべての書籍タイトルのリストが含まれます。 関数の最後にtext_output変数が返されます。

例11-47は、subjectテーブルの”Children’s Books”を表す2が引数として渡された場合のextract_title()関数の結果を示しています。

row_data変数は、booksテーブルのレコードを保持するためにのみ使用されるため、booksテーブルの%ROWTYPEofとして宣言されています。 同じ結果を達成するためにrow_dataをaRECORDとして宣言することもできますが、特定のテーブルの行だけでなく、変数を使用する場合はRECORDtypeを使用する必要があ:

row_data RECORD;

extract_title()関数は、行データがRECORDとして宣言されているか、%ROWTYPEを使用して宣言されているかにかかわらず、同じ結果を返します。

コメントを残す

メールアドレスが公開されることはありません。