insert、update、delete 操作は、各入力パラメーターが 1 つの値のみを取る場合に使用できます。または、一括操作では、一連のパラメーター値を使用して 1 つのクエリを実行できます。
一括操作を実行すれば、不要なステップを回避して次の利点を得ることができます。
このユースケースでは、コネクタは <db:bulk-insert>、<db:bulk-update>、<db:bulk-delete> の 3 つの操作を提供します。
これらの操作は、対応する単一操作と似ていますが、入力パラメーターをキー - 値のペアで受け取るのではなく、キー - 値のペアのリストとして受け取ることを想定しています。
<db:bulk-insert config-ref="dbConfig" >
<db:bulk-input-parameters>
#[[{'id': 2, 'name': 'George', 'lastName': 'Costanza'}, {'id': 3, 'name': 'Cosmo', 'lastName': 'Kramer'}]]
</db:bulk-input-parameters>
<db:sql>
insert into customers (id, name, lastName) values (:id, :name, :lastName)
</db:sql>
</db:bulk-insert>
一括操作を使用しない場合、delete 操作の実行時に 1 つの条件 (POSITION = X) のみが提供されると、複数の行が条件に一致して削除される可能性があります。
同じ概念が更新にも適用されます。UPDATE PRODUCTS set PRICE = PRICE * 0.9 where PRICE > :price を使用するときに、複数の商品に 10% 割引を適用したい場合でも、price 入力パラメーターは 1 つの値のみを受け入れます。
価格の異なる商品に異なる割引率を適用するには、多くの操作を実行します。
次の例は、構造 { price : number, discountRate: number} のオブジェクトのリストであるペイロードです。
<foreach>
<db:update config-ref="dbConfig">
<db:input-parameters>
#[
{
'discountRate' : payload.discountRate,
'price' : payload.price,
}
]
</db:input-parameters>
<db:sql>
UPDATE PRODUCTS set PRICE = PRICE * :discountRate where PRICE > :price
</db:sql>
</db:update>
</foreach>
前の操作ではタスクを遂行できますが、非効率的です。リストの要素ごとに、操作の各要素で 1 つのクエリを実行する必要があります。
いずれかの操作の実行中にエラーが発生した場合 (たとえば、100 行の一括挿入のうち 1 行の挿入に失敗した場合)、1 つの例外がスローされます。
一括操作の一部のステートメントは正常に実行できても、他のステートメントはエラーになる可能性があります。この場合、ドライバーが次のいずれかを実行します。
-
実行をすぐに停止し、残りのすべての操作を無視する
-
残りのステートメントの実行を続行する。
どちらの場合も、エラーが発生するたびにアプリケーションログを調べて、失敗の原因を確認できます。この場合、問題の原因を説明する 1 つの例外がスローされます。