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文は実行されません。

  • 例12-8FORALL文のDELETE文

  • 例12-9FOR LOOP文およびFORALL文におけるINSERT文の時間の違い

  • 例12-10コレクションのサブセットに対するFORALL文

  • 例12-11疎コレクションおよびそのサブセットに対するFORALL文

  • 例12-12FORALL例外の即時処理

  • 例12-13FORALL文が完了した後のFORALL例外の処理

  • 例12-26FORALL文でのRETURN BULK COLLECT INTO付きのDELETE

  • 例12-28無名ブロックによる入力ホスト配列のバルク・バインド