ストアド プロシージャの実行(FireDAC)
コマンドの操作(FireDAC) への移動
目次
TFDStoredProc の使用
一般に、TFDStoredProc は、設計時または実行時あるいはその両方でセットアップすることができます。TFDStoredProc では、TFDStoredProc のプロパティ値に基づいて、ストアド プロシージャを呼び出す SQL コマンドを透過的に生成します。実行前、FireDAC ではパラメータ値を DBMS に送信し、その後でストアド プロシージャを実行し、出力パラメータ値を受け取ります。
- メモ: FireDAC では、デフォルト値を持つパラメータをサポートしていません。
設計時でのストアド プロシージャのセットアップ
ストアド プロシージャを実行するには、TFDStoredProc コンポーネントをフォームにドロップします。TFDStoredProc.Connection は、そのフォーム上に TFDConnection があれば、それを指すように自動的に設定されます。
その後、オプションで、CatalogName、SchemaName、PackageName の各プロパティを設定するか、ドロップダウン リストからそれらの値を選択します。StoredProcName を設定すると、fiMeta が FetchOptions.Items に含まれている場合は、Params コレクションの値が自動的に入力されます。
パラメータ名を統一する場合は、ResourceOptions.UnifyParams を True に設定します。この結果、たとえば、SQL Server のストアド プロシージャ パラメータ名から先頭の '@' が取り除かれます。
実行時でのストアド プロシージャのセットアップ
設計時の操作と似ています。ただ以下のコードを使用する必要があるだけです。
FDStoredProc1.StoredProcName := 'my_proc';
FDStoredProc1.Prepare;
// now the Params collection is filled in
fiMeta が FetchOptions.Items に含まれている場合は、Prepare を呼び出すと、mkProcArgs メタデータを使って Params コレクションに値が入力されます。
- メモ:
- mkProcArgs のクエリは時間がかかるおそれがあります。
- アプリケーションでは、Params に値が入力された後でパラメータ定義を変更することはできません。たとえば、TADParam.AsXxxx プロパティに値を割り当てると、パラメータのデータ型が暗黙に設定されます。
上記の問題を避けるには、Prepare の呼び出し時に Params コレクションが自動的にセットアップされないように、FetchOptions.Items から fiMeta を除外します。また、Prepare または ExecProc を呼び出す前に、次のコードを使って Params コレクションに手動で値を入力します。
FDStoredProc1.StoredProcName := 'my_proc';
FDStoredProc1.FetchOptions.Items := FDStoredProc1.FetchOptions.Items - [fiMeta];
FDStoredProc1.Command.FillParams(FDStoredProc1.Params);
または、次のコードを使って行うこともできます。
FDStoredProc1.StoredProcName := 'my_proc';
FDStoredProc1.FetchOptions.Items := FDStoredProc1.FetchOptions.Items - [fiMeta];
with FDStorecProc1.Params do begin
Clear;
with Add do begin
Name := 'Par1';
ParamType := ptInput;
DataType := ftString;
Size := 50;
end;
with Add do begin
Name := 'Par2';
ParamType := ptOutput;
DataType := ftInteger;
end;
end;
パッケージ プロシージャの使用
パッケージ プロシージャ(パッケージ化されたプロシージャ)をアプリケーションで使用するには、パッケージ名を指定する必要があります。それには、次のいずれかを行います。
- PackageName を設定する -- パッケージ名は "[<カタログ名gt;.][<スキーマ名>.]<パッケージ名>" の形式で指定できます。
- StoredProcName を設定する -- ストアド プロシージャ名は "[<カタログ名>.][<スキーマ名>.]<パッケージ名>.<ストアド プロシージャ名>" の形式で指定できます。
オーバーロード プロシージャをアプリケーションで選択するには、Overload プロパティを指定する必要があります。Oracle の場合の例を以下に示します。
FDStoredProc1.PackageName := 'SYS.DBMS_SQL';
FDStoredProc1.Overload := 1;
FDStoredProc1.StoredProcName := 'BIND_VARIABLE';
ストアド プロシージャの実行
結果セットを返さないストアド プロシージャを実行するには、ExecProc メソッドを使用します。ストアド関数を実行するには、ExecProc メソッドまたは ExecFunc メソッドを使用します。ExecFunc の方は関数値を返します。ストアド プロシージャが結果セットを返す場合は、"[FireDAC][Phys][Oracl]-310。結果セットを返すコマンドは実行できません" という例外が発生します。
- メモ: ExecProc と ExecFunc にはオーバーロード メソッドがいくつかあり、それらを使用する場合は、TFDStoredProc プロパティを使用せずに、必要な情報をすべてメソッド引数として指定することができます。以下に例を示します。
FDStoredProc1.StoredProcName := 'MY_PROC';
FDStoredProc1.Prepare;
FDStoredProc1.Params[0].Value := 100;
FDStoredProc1.Params[1].Value := 'audi';
FDStoredProc1.ExecProc;
あるいは、もっと簡潔に、次のようにすることもできます。
FDStoredProc1.ExecProc('MY_PROC', [100, 'audi']);
結果セットを返すストアド プロシージャを実行し、その結果セットを開くには、Open メソッドを使用します。ストアド プロシージャが結果セットを返さない場合は、"[FireDAC][Phys][Oracl]-308。コマンドを開くまたは定義することができません。これは結果セットを返さないコマンドです" という例外が発生します。ストアド プロシージャが複数の結果セットを返す場合は、「コマンド バッチ」でその詳細を参照してください。
- メモ: ストアド プロシージャは非同期的に実行することができます。
TFDQuery の使用
TFDStoredProc と TFDQuery の主な違いは、TFDStoredProc ではパラメータの情報を使ってストアド プロシージャ呼び出しが自動的に生成されることです。ストアド プロシージャを呼び出す SQL コードは、FireDAC における SQL コマンドの任意の実行方法を使って直接実行することができます。たとえば、以下では、TFDQuery を使って Oracle のパッケージ プロシージャを呼び出しています。
with FDQuery1.SQL do begin
Clear;
Add('begin');
Add(' sys.dbms_sql.bind_variable(:c, :name, :value');
Add('end;');
end;
FDQuery1.Params[0].AsInteger := 1;
FDQuery1.Params[1].AsString := 'p1';
FDQuery1.Params[2].AsInteger := 100;
FDQuery1.ExecSQL;
TFDCommand の使用
最後に、TFDCommand を使用して、ストアド プロシージャを実行することができます。上記の仕様のほとんどは、TFDCommand にも適用することができます。