FORALLステートメントを使用した一括データ処理
前のチュートリアルは、バルクコレクトシリーズからの短い休憩でした。結局、それは聴衆からの要求であり、私たちはそれを果たす義務がありました。しかし、私たちが軌道に戻っていることを心配しないでください。それでは、OracleDatabaseでFORALLステートメントを使用したバルクデータ処理の概要を見てみましょう。
私が話しているチュートリアルがわからない場合は、こちらを確認してください。それでは、トピックに取り掛かりましょう。
FORALLステートメントとは何ですか?
FORALLステートメントは、PL / SQLエンジンからSQLエンジンにDMLステートメントまたはMERGEステートメント(11g以上を使用している場合)をバッチで送信することにより、最適化された方法でバルクデータを処理するのに役立ちます。
FORALLステートメントを、DMLステートメントまたはMERGEステートメントを1回または一度に複数回実行するバルクループ構造として定義することもできます。
一括収集は、クエリを最適化し、コンテキストスイッチを減らすことでパフォーマンスを向上させます。 FORALLは、Insert、Delete、UpdateなどのDMLステートメント、またはMERGEステートメントに対して同じことを行います。
FORALLステートメントの構文は何ですか?
構文は非常に単純です。見てみましょう。
FORALL index IN bound_clauses [SAVE EXCEPTION] DML statement;
場所:
FORALL OracleReservedキーワードです。
インデックス PL/SQLエンジンによってPLS_INTEGERとして宣言される暗黙的に定義されたループカウンタです。 PL / SQLエンジンによって暗黙的に定義されるため、定義する必要はありません。インデックスの範囲は、それが定義されているFORALLステートメントに限定されます。
Bound_Clauses ループの反復回数を制御する句です。また、インデックスの値もそれに依存しています。 Oracle PL / SQLには3種類のバインドされた句があり、このチュートリアルの後半で個別に説明します。
例外を保存 DMLステートメントが例外を引き起こした場合でも、FORALLステートメントを実行し続けるオプションの選択肢です。これらの例外は、SQL%Bulk_Exceptionsというカーソル属性に保存されます。
情報:
SAVE EXCEPTIONにより、例外が発生してもFORALLステートメントが突然終了することはありません。これは、FORループに対するFORALLステートメントの利点です。
DMLステートメント :DMLステートメントは、INSERT、UPDATE、DELETEなどの任意のDMLステートメントにすることができます。 Oracle 11g以降を使用している場合は、FORALLでMERGEステートメントを使用することもできます。ただし、DMLステートメントまたはMERGEステートメントがそのVALUESまたはWHERE句で少なくとも1つのコレクションを参照している必要があることを確認する必要があります。
さらに、FORループとは異なり、FORALLステートメントでは、一度に1つのDMLしか使用できません。これがFORALLの欠点です。
FORALLはFORループのようなループですか?
いいえ、FORALLステートメントはコレクションのすべての行を繰り返し処理しますが、FORループではありません。構文を注意深く見た場合、「FORループ」とは異なり、FORALLステートメントのブロックがキーワードLOOPで始まっておらず、キーワードENDLOOPで終わっていないことに気付いたはずです。
FORALLを使用してDMLの挿入と更新を一度に実行できますか?
いいえ、残念ながら、FORALLを使用したFORループとは異なり、一度に複数のDMLを実行することはできません。これは、挿入または更新のいずれかを同時に実行することはできず、両方を同時に実行することはできないことを意味します。これがFORALLステートメントの欠点です。
カーソル属性SQL%Bulk_Exceptionsとは何ですか?
カーソル属性SQL%Bulk_Exceptionsは、Error_IndexとError_Codeの2つのフィールドを持つレコードのコレクションです。 Error_Indexは、例外が発生した過程でのFORALLステートメントの反復回数を格納します。一方、Error_Codeは、発生した例外に対応する例外コードを格納します。
FORALLステートメントの実行中に発生した例外の数を確認できますか?
SQL%BULK_EXCEPTION.COUNTを使用して、FORALLステートメントの実行中に発生した例外の数を簡単に確認できます。
これらのバインドされた句は何ですか?それらについて何か教えてください。
上記のように、Bound句は、ループインデックスの値とFORALLステートメントの反復回数を制御します。 OracleDatabaseのFORALLステートメントで使用できるバインドされた句には3つのタイプがあります。これらは次のとおりです。
- 下界と下界
- およびのインデックス
- の値
下限と上限 :FOR LOOPと同様に、このバインドされた句では、参照されるコレクションの連続するインデックス番号の有効な開始と終了を指定する必要があります。
DMLステートメントで参照されるコレクションの数については、このバインドされた句とともに、連続するインデックス番号の有効な範囲を指定する必要があります。ただし、この句で参照されているコレクションがまばらであることが判明した場合は、エラーが発生する可能性があります。発生するエラーは次のとおりです:
ORA-22160: element at index [3] does not exist
参照されるコレクションがまばらで、Oracle 10g以降を使用している場合は、他の2つのオプションである「Indices-of」と「Values-of」を使用することをお勧めします。
の指標 :私たちが利用できる2番目のバインドされた句は「インデックス」です。このバインドされた句により、FORALLステートメントは連想配列やネストされたテーブルなどのまばらなコレクションをループできます。
推奨読書:PL/SQLコレクションの概要
の価値 :3番目のバインドされた句はの値です。 VALUES OFオプションは、ループカウンターの指定されたコレクションの要素の値がFORALLステートメントの値の基礎であることを明確にします。基本的に、このコレクションは、FORALLステートメントがループできるインデックスのグループです。さらに、これらのインデックスは一意である必要はなく、任意の順序でリストできます。
ビデオチュートリアルを見てより早く学ぶために、ここにFORALLステートメントを詳細に説明するものがあります。
今後のチュートリアルでは、これらすべてのバインドされた句をFORALLステートメントで使用する方法を学習する予定ですので、しばらくお待ちください。最新のアップデートについては、私のYouTubeチャンネルに登録して、私のソーシャルメディアでフォローしてください。
ありがとう、そして素晴らしい一日を!