コマンド バッチ(FireDAC)
コマンドの操作(FireDAC) への移動
概要
コマンド バッチとは、アプリケーションから DBMS へ一度に送信されて実行される一連の SQL 文です。DBMS では、バッチに含まれるステートメントをコンパイルして、1 つの実行計画を作成します。その後、実行計画内のステートメントが 1 つずつ実行されます。これにより、ネットワーク トラフィックとサーバー負荷を最小限に抑えることができます。実行が済むと、DBMS はコマンドによって作成された結果セットをクライアントに返します。
結果セットの処理
FireDAC では、NextRecordSet メソッドを使って、すべての結果セットを 1 つずつ処理することができます。すべての結果セットを処理できるようにするには、FetchOptions.AutoClose を False に設定してからコマンドを実行してください。設定しなければ、最初のカーソルの Eof に到達した直後にカーソルが閉じられ、他のカーソルは破棄されます。
次に示すのは SQL Server の例です。
FDQuery1.FetchOptions.AutoClose := False;
FDQuery1.SQL.Add('select * from [Orders]');
FDQuery1.SQL.Add('select * from [Order Details]');
FDQuery1.Open; // [Orders] table rows are accessable here
FDQuery1.NextRecordSet; // [Order Details] table rows available here
アプリケーションでは、TFDMemTable と Data プロパティを使って、それぞれの結果セットを別々のデータセットに格納することができます。以下に例を示します。
FDQuery1.FetchOptions.AutoClose := False;
FDQuery1.SQL.Text := 'select * from orders; select * from customers';
FDQuery1.Open;
FDQuery1.FetchAll;
// assign orders records to FDMemTable1
FDMemTable1.Data := FDQuery1.Data;
FDQuery1.NextRecordSet;
FDQuery1.FetchAll;
// assign customers records to FDMemTable2
FDMemTable2.Data := FDQuery1.Data;
FireDAC では、列や行を持たない空の結果セットは自動的にスキップされます。
DBMS とバッチ
DBMS でコマンド バッチをサポートしている必要があり、それが FireDAC を使って実行されます。DBMS でバッチをサポートしていない場合には、SQL スクリプトを使用することができます。以下は、バッチをサポートしている DBMS です。
DBMS | 備考 |
---|---|
IBM DB2 | コマンド間は ';' で区切って指定しなければなりません。 |
Firebird | EXECUTE BLOCK 構文要素を使用します。 |
Informix | コマンド間は ';' で区切って指定しなければなりません。コマンド バッチでは、1 つの DB アクセス コマンドのみ含まれる場合があります。 |
Microsoft SQL Server | 必要であれば、コマンド間を ';' で区切って指定することができます。 |
MySQL | コマンド間は ';' で区切って指定しなければなりません。 |
Oracle | BEGIN END 無名ブロック構文要素を使用します。 |
PostgreSQL | コマンド間は ';' で区切って指定しなければなりません。
パラメータのないバッチは ResourceOptions.DirectExecute を True に設定して実行することができます。 PostgreSQL バージョン 9.0 以降では、DO BEGIN END 無名ブロック構文要素を使用します。 |
SQLite | コマンド間は ';' で区切って指定しなければなりません。 |
SQL Anywhere | 必要であれば、コマンド間を ';' で区切って指定することができます。 |
Teradata Database | コマンド間は ';' で区切って指定しなければなりません。 |
また、FireDAC では、複数の結果セットを返すコマンドを完全にサポートしています。以下に例をいくつか示します。
- REF CURSOR を使用した Oracle のストアド プロシージャ
- カーソルがネストした Oracle の結果セット
- RETURNS SETOF および/または OUT REFCURSOR 引数を持つ PostgreSQL ストアド関数
- メモ: 複数の INSERT/UPDATE/DELETE コマンドを実行する場合には、配列 DML 機能を使用することを検討してください。サイズの大きいバッチの場合には、その方がずっと効率的です。