13.34 FORALL文
FORALL
文は、VALUES
句およびWHERE
句の異なる値を使用して、1つのDML文を複数回実行します。
これらの異なる値は、データが移入された既存のコレクションまたはホスト配列から取得されます。通常、FORALL
文は、同等のFOR
LOOP
文よりはるかに高速です。
注意:
FORALL
文を使用できるのは、クライアント・プログラム内ではなく、サーバー・プログラム内のみです。
ここでのトピック
構文
forall_statement ::=
bounds_clause ::=
セマンティクス
forall_statement
index
FORALL
文に対してローカルな、暗黙に宣言された整変数の名前。FORALL
文の外側の文はindex
を参照できません。FORALL
文の内側の文はindex
を索引変数として参照できますが、式の中で使用したり、その値を変更することはできません。FORALL
文の実行後、index
は未定義になります。
dml_statement
VALUES
句またはWHERE
句内の1つ以上のコレクションを参照する、静的または動的なINSERT
文、UPDATE
文、DELETE
文またはMERGE
文。パフォーマンス上のメリットは、index
を索引として使用するコレクション参照に対してのみ適用されます。
dml_statement
が参照するすべてのコレクションには、index
の値と一致する索引が必要です。DELETE
メソッド、EXTEND
メソッドまたはTRIM
メソッドをあるコレクションに適用する場合、他のコレクションにも適用すると、すべてのコレクションに同じ索引のセットが含まれます。参照されている要素がないコレクションがある場合は、PL/SQLによって例外が呼び出されます。
dml_statementの制限
dml_statement
が動的SQL文の場合、USING
句の値(動的SQL文のバインド変数)は、式ではなくコレクションへの単純参照である必要があります。たとえば、collection
(
i
)
は有効ですが、UPPER(
collection
(
i
))
は有効ではありません。
SAVE EXCEPTIONS
一部のDML文が失敗してもFORALL
文を継続させることができます。詳細は、「FORALL文が完了した後のFORALL例外の処理」を参照してください。
bounds_clause
変数index
の値を提供する、コレクション要素の索引を指定します。それぞれの値に対して、SQLエンジンによってdml_statement
が1回実行されます。
lower_bound .. upper_bound
lower_bound
およびupper_bound
はいずれも、FORALL
文が入力されるとPL/SQLによって1回評価され、必要に応じて最も近い整数に四捨五入される数式です。結果の整数は、連続した索引番号の有効範囲の下限と上限である必要があります。この範囲内の要素が存在しなかったり、削除されていた場合は、PL/SQLによって例外が呼び出されます。
INDICES OF collection [ BETWEEN lower_bound AND upper_bound ]
index
の値が、collection
の要素の索引に対応するように指定します。索引は連続していなくてもかまいません。
lower_bound
およびupper_bound
はいずれも、FORALL
文が入力されるとPL/SQLによって1回評価され、必要に応じて最も近い整数に四捨五入される数式です。結果の整数は索引番号の有効範囲の下限と上限ですが、連続していなくてもかまいません。
collectionの制限
collection
が連想配列の場合、PLS_INTEGER
で索引付けする必要があります。
VALUES OF index_collection
index
の値が、PLS_INTEGER
で索引付けされたPLS_INTEGER
要素のコレクションindex_collection
の要素であると指定します。index_collection
の索引は連続していなくてもかまいません。index_collection
が空の場合、PL/SQLによって例外が呼び出され、FORALL
文は実行されません。
例