FORALL
文は、一連の静的DML文または動的DML文を発行します。通常、FOR
ループを使用する場合より高速に処理を実行できます。 この文には、いくつかの設定コードが必要です。これは、ループが繰り返されるたびに、VALUES
句またはWHERE
句内の1つ以上のコレクションの値が使用されるためです。
構文
forall_statement ::=
bounds_clause ::=
キーワードとパラメータの説明
索引変数の値が指定したコレクション要素の添字に対応するように指定する句です。 この句を使用すると、いくつかの要素が削除されたネストした表、または数値の添字を持つ結合配列で、FORALL
を使用できます。
BETWEEN lower_bound AND upper_bound
INDICES
OF
句の添字の範囲を制限します。 範囲内の添字がコレクションに存在しない場合、その添字はスキップされます。
VALUES OF index_collection_name
FORALL
索引変数の添字に、index_collection_name
で指定した別のコレクションの要素の値が使用されるように指定する句です。 ここで使用する別のコレクションは、ポインタのセットとして機能します。index_collection_name
で指定する要素に応じて、FORALL
は任意の順序で添字に対する反復処理を実行できます(同じ添字を複数回使用することもできます)。
索引コレクションは、ネストした表であるか、またはPLS_INTEGER
かBINARY_INTEGER
によって索引付けされ、要素もPLS_INTEGER
かBINARY_INTEGER
である結合配列である必要があります。 索引コレクションが空の場合、例外が呼び出され、FORALL
文は実行されません。
index_name
コレクションの添字として、FORALL
文の中でのみ参照できる、未宣言の識別子です。
index_name
の暗黙的な宣言は、ループの外側での宣言をオーバーライドします。 文の中では同じ名前の別の変数を参照できません。 FORALL
文の中では、index_name
は式に使用したり値を代入できません。
lower_bound .. upper_bound
連続した索引番号の有効範囲を指定する数式です。 必要に応じて、PL/SQLはこれらの番号を最も近い整数に四捨五入します。 SQLエンジンは、範囲内の各索引番号に対して一度ずつSQL文を実行します。 この式は、FORALL
文を入力すると、一度評価されます。
一部のDML操作が失敗してもFORALL
ループを継続させるオプションのキーワードです。 プログラムでは、例外をただちに呼び出すのではなく、FORALL
文の終了後に例外を1つ呼び出します。 エラーの詳細は、SQL%BULK_EXCEPTIONS
でループの後に取得できます。 プログラムでは、発生するたびに例外を個別に処理するのではなく、FORALL
ループの後ですべてのエラーをレポートまたはクリーンアップできます。 「FORALL例外の処理(%BULK_EXCEPTIONS属性)」を参照してください。
sql_statement
VALUES
句またはWHERE
句内のコレクション要素を参照するUPDATE
またはDELETE
などの静的DML文、あるいは動的(EXECUTE
IMMEDIATE
)DML文です。
使用上の注意
SQL文は複数のコレクションを参照できますが、パフォーマンス上のメリットは、添字付きコレクションにのみ適用されます。
FORALL
文が失敗すると、データベースの変更は、各SQL文の実行の前にマークされた暗黙的なセーブポイントまでロールバックされます。 前回のFORALL
ループの反復中に行われた変更はロールバックされません。
制限
FORALL
文には、次の制限が適用されます。
キーが文字列型の結合配列の要素は、ループできません。
FORALL
ループ内では、UPDATE
文のSET
句とWHERE
句の両方で、同じコレクションを参照することはできません。 この場合は、そのコレクションの2つ目のコピーを作成し、WHERE
句では新しい名前を参照する必要があります。
FORALL
文を使用できるのは、クライアント側ではなく、サーバー側のプログラム内のみです。
INSERT
文、UPDATE
文またはDELETE
文では少なくとも1つのコレクションを参照する必要があります。 たとえば、ループで一連の定数値を挿入するFORALL
文では、例外が呼び出されます。
明示的な範囲を指定する場合は、その範囲内のすべてのコレクション要素が存在している必要があります。 要素が存在しなかったり削除されていた場合は、エラーが発生します。
INDICES
OF
句またはVALUES
OF
句を使用する場合、DML文で参照されるすべてのコレクションの添字が、索引変数の値と一致している必要があります。 DELETE
、EXTEND
などの操作は、どのコレクションも同じ添字のセットを持つように、すべてのコレクションに適用してください。 参照されている要素がいずれかのコレクション内に存在しない場合は、エラーが発生します。 SAVE
EXCEPTIONS
句を使用している場合、このエラーは他のエラーと同じように扱われ、FORALL
文は停止されません。
コレクションの添字は式(i+1
など)ではなく、索引変数(i
など)である必要があります。
カーソル属性%BULK_ROWCOUNT
は、他のコレクションに代入したり、パラメータとしてサブプログラムに渡すことはできません。
FORALL
で動的SQL文が使用される場合、USING
句の値(動的SQL文のバインド)は、式ではなくコレクションへの単純参照である必要があります。 たとえば、collection_name
(
i
)
は有効ですが、UPPER(
collection_name
(
i
)
は有効ではありません。
関連トピック