SQL ステートメントのバッチ
SQL ステートメントのバッチとは、2 つ以上の SQL ステートメントのグループ、または 2 つ以上の SQL ステートメントのグループと同じ効果を持つ単一の SQL ステートメントのグループです。 一部の実装では、結果を使用できるようになる前にバッチ ステートメント全体が実行されます。 ネットワーク トラフィックが減ることがよくあり、データ ソースが SQL ステートメントのバッチの実行を最適化する場合があるため、これは多くの場合、ステートメントを個別に送信するよりも効率的です。 他の実装では、SQLMoreResults を呼び出すと、バッチ内の次のステートメントの実行がトリガーされます。 ODBC では、次の種類のバッチがサポートされています。
明示的なバッチ明示的な バッチ は、セミコロン (;)で区切られた 2 つ以上の SQL ステートメントです。 たとえば、次の SQL ステートメントのバッチでは、新しい販売注文が開きます。 そのためには、Orders テーブルと Lines テーブルの両方に行を挿入する必要があります。 最後のステートメントの後にセミコロンがないことに注意してください。
INSERT INTO Orders (OrderID, CustID, OpenDate, SalesPerson, Status) VALUES (2002, 1001, {fn CURDATE()}, 'Garcia', 'OPEN'); INSERT INTO Lines (OrderID, Line, PartID, Quantity) VALUES (2002, 1, 1234, 10); INSERT INTO Lines (OrderID, Line, PartID, Quantity) VALUES (2002, 2, 987, 8); INSERT INTO Lines (OrderID, Line, PartID, Quantity) VALUES (2002, 3, 566, 17); INSERT INTO Lines (OrderID, Line, PartID, Quantity) VALUES (2002, 4, 412, 500)
プロシージャ プロシージャに 1 つ以上の SQL ステートメントが含まれている場合は、SQL ステートメントのバッチと見なされます。 たとえば、次の SQL Server 固有のステートメントでは、顧客に関する情報を含む結果セットと、その顧客のすべての未処理販売注文を一覧表示する結果セットを返すプロシージャが作成されます。
CREATE PROCEDURE GetCustInfo (@CustomerID INT) AS SELECT * FROM Customers WHERE CustID = @CustomerID SELECT OrderID FROM Orders WHERE CustID = @CustomerID AND Status = 'OPEN'
CREATE PROCEDURE ステートメント自体は、SQL ステートメントのバッチではありません。 ただし、作成するプロシージャは SQL ステートメントのバッチです。 CREATE PROCEDURE ステートメントは SQL Server に固有であり、SQL Server では CREATE PROCEDURE ステートメント で複数のステートメントを区切るためにセミコロンを必要としないため、2 つの SELECT ステートメントをセミコロンで区切る必要はありません。
パラメーターの配列 パラメーター の配列は、一括操作を実行する効果的な方法として、パラメーター化された SQL ステートメントと共に使用できます。 たとえば、次 の INSERT ステートメントでパラメーターの配列を使用すると、1 つの SQL ステートメントのみを実行しながら Lines テーブルに複数の行を挿入できます。
INSERT INTO Lines (OrderID, Line, PartID, Quantity) VALUES (?, ?, ?, ?)
データ ソースがパラメーターの配列をサポートしていない場合、ドライバーはパラメーターのセットごとに SQL ステートメントを 1 回実行することで、それらをエミュレーションできます。 詳細については、 このセクションで後述する「ステートメント パラメーター と パラメーター値の配列」を参照してください。
異なる種類のバッチを相互運用可能な方法で混在することはできません。 つまり、プロシージャ呼び出し、パラメーターの配列を使用する明示的なバッチ、パラメーターの配列を使用するプロシージャ呼び出しを含む明示的なバッチを実行した結果をアプリケーションが判断する方法は、ドライバー固有です。
このセクションでは、次のトピックを扱います。