コマンド バッチ(FireDAC)

提供: RAD Studio
移動先: 案内検索

コマンドの操作(FireDAC) への移動

概要

コマンド バッチとは、アプリケーションから DBMS へ一度に送信されて実行される一連の SQL 文です。DBMS では、バッチに含まれるステートメントをコンパイルして、1 つの実行計画を作成します。その後、実行計画内のステートメントが 1 つずつ実行されます。これにより、ネットワーク トラフィックとサーバー負荷を最小限に抑えることができます。実行が済むと、DBMS はコマンドによって作成された結果セットをクライアントに返します。



結果セットの処理

FireDAC では、NextRecordSet メソッドを使って、すべての結果セットを 1 つずつ処理することができます。すべての結果セットを処理できるようにするには、FetchOptions.AutoCloseFalse に設定してからコマンドを実行してください。設定しなければ、最初のカーソルの 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

アプリケーションでは、TFDMemTableData プロパティを使って、それぞれの結果セットを別々のデータセットに格納することができます。以下に例を示します。

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.DirectExecuteTrue に設定して実行することができます。 PostgreSQL バージョン 9.0 以降では、DO BEGIN END 無名ブロック構文要素を使用します。

SQLite コマンド間は ';' で区切って指定しなければなりません。
SQL Anywhere 必要であれば、コマンド間を ';' で区切って指定することができます。
Teradata Database コマンド間は ';' で区切って指定しなければなりません。

また、FireDAC では、複数の結果セットを返すコマンドを完全にサポートしています。以下に例をいくつか示します。

  • REF CURSOR を使用した Oracle のストアド プロシージャ
  • カーソルがネストした Oracle の結果セット
  • PostgreSQL のカーソルを返すさまざまなステートメント
メモ: 複数の INSERT/UPDATE/DELETE コマンドを実行する場合には、配列 DML 機能を使用することを検討してください。サイズの大きいバッチの場合には、その方がずっと効率的です。

関連項目

サンプル