私は構造の配列を持っています。その配列のすべての行をテーブルに挿入する必要があります。そのため、単純にcfquery
insidecfloop
を使用してデータベースに挿入しました。
データベースへの新しい接続を毎回作成するため、cfloop 内で cfquery を使用しないように提案する人もいました。
しかし、私の場合、cfquery内でcfloopを使用せずにこれを行う方法はありますか?
私は構造の配列を持っています。その配列のすべての行をテーブルに挿入する必要があります。そのため、単純にcfquery
insidecfloop
を使用してデータベースに挿入しました。
データベースへの新しい接続を毎回作成するため、cfloop 内で cfquery を使用しないように提案する人もいました。
しかし、私の場合、cfquery内でcfloopを使用せずにこれを行う方法はありますか?
ループ内のクエリとクエリ内のループの両方を使用しました。クエリ内でループを使用する方が理論的には高速ですが、常にそうであるとは限りません。それぞれの方法を試して、状況に最適なものを確認する必要があります。
データベースを選択するために oracle を使用した、クエリ内のループの構文を次に示します。
insert into table
(field1, field2, etc)
select null, null, etc
from dual
where 1 = 2
<cfloop>
union
select <cfqueryparam value="#value1#">
, <cfqueryparam value="#value2#">
etc
from dual
</cfloop>
<CFQUERY><cfloop>
を使用するときに実行できる...反復回数には制限があります<cfqueryparam>
。これもベンダー固有です。生成するレコードの数がわからない場合<cfqueryparam>
は、安全に削除できる場合は、 を削除することをお勧めします。データが信頼できるソースからのものであり、サニタイズされていることを確認してください。このアプローチは、外部ループとは異なり、データベース サーバーへの呼び出しを 1 回だけ行うため、処理時間を大幅に節約できます。
データベースによっては、構造体の配列を XML に変換し、それを単一のパラメーターとしてストアド プロシージャに渡します。
ストアド プロシージャで、SELECT ステートメントが XML パケットからデータを選択する INSERT INTO SELECT を実行します。このように、単一の INSERT ステートメントで数百または数千のレコードを挿入できます。
ここに例があります。