ストアド プロシージャのパラメータの取り扱い
ストアド プロシージャには、次の 4 種類のパラメータを関連付けることができます。
- 入力パラメータ -- 値をストアド プロシージャに渡して処理させるために使用されます。
- 出力パラメータ -- ストアド プロシージャで戻り値をアプリケーションに渡すために使用されます。
- 入出力パラメータ -- 値をストアド プロシージャに渡して処理させるために使用され、そのストアド プロシージャで戻り値をアプリケーションに渡すためにも使用されます。
- 結果パラメータ -- 一部のストアド プロシージャでエラー値やステータス値をアプリケーションに返すために使用されます。ストアド プロシージャから返すことができる結果パラメータは 1 つだけです。
ストアド プロシージャで特定の種類のパラメータが使用されるかどうかは、データベース サーバーにおける汎用言語によるストアド プロシージャの実装によっても、実際の個々のストアド プロシージャによっても異なります。どのようなサーバーの場合も、個々のストアド プロシージャには入力パラメータを使用するものと使用しないものがあります。一方、サーバーごとにパラメータの使用法が決まっている場合もあります。たとえば、MSSQL サーバーと Sybase では、ストアド プロシージャは必ず結果パラメータを返しますが、InterBase に実装されているストアド プロシージャでは結果パラメータを決して返しません。
Params プロパティ(TStoredProc、TSQLStoredProc、TIBStoredProc の場合)または Parameters プロパティ(TADOStoredProc の場合)を通じて、ストアド プロシージャのパラメータにアクセスできます。StoredProcName(または ProcedureName)プロパティに値を割り当てると、データセットにより、ストアド プロシージャのパラメータごとにオブジェクトが自動的に生成されます。一部のデータセットについては、ストアド プロシージャ名が実行時まで指定されない場合、各パラメータのオブジェクトを実行時にプログラムで作成する必要があります。ストアド プロシージャを指定せず TParam オブジェクトまたは TParameter オブジェクトを手動で作成することにより、単一のデータセットを、使用可能な任意の数のストアド プロシージャで使用することができます。
メモ: 一部には、出力パラメータと結果パラメータに加えてデータセットも返すストアド プロシージャがあります。アプリケーションでは、データセット レコードをデータ対応コントロールに表示できますが、出力パラメータと結果パラメータを別々に処理する必要があります。
設計時のパラメータのセットアップ
パラメータ コレクション エディタを使って、設計時にストアド プロシージャのパラメータ値を指定できます。パラメータ コレクション エディタを表示するには、[オブジェクト インスペクタ]で Params プロパティまたは Parameters プロパティの参照([...])ボタンをクリックします。
警告: パラメータ コレクション エディタでパラメータを選択し、[オブジェクト インスペクタ]で Value プロパティを設定することにより、入力パラメータに値を割り当てることができます。ただし、サーバーから通知される入力パラメータの名前やデータ型は変更しないでください。そうしないと、ストアド プロシージャを実行したときに例外が発生します。
一部には、パラメータの名前やデータ型を通知しないサーバーもあります。その場合は、パラメータ コレクション エディタを使って手動でパラメータをセットアップする必要があります。右クリックし、コンテキスト メニューから[追加]を選択してパラメータを追加します。追加する各パラメータを完全に記述する必要があります。パラメータを追加する必要がなくても、個々のパラメータ オブジェクトのプロパティを確認して、間違いがないようにしてください。
データセットに Params プロパティ(一連の TParam オブジェクト)がある場合、次のプロパティを正しく指定する必要があります。
- Name プロパティ -- ストアド プロシージャで定義されているとおりにパラメータの名前を示します。
- DataType プロパティ -- パラメータ値のデータ型を示します。TSQLStoredProc を使用する場合、一部のデータ型には付加的な情報が必要です。
- NumericScale プロパティ -- 数値パラメータの小数点以下の桁数を示します。
- Precision プロパティ -- 数値パラメータの全桁数を示します。
- Size プロパティ -- 文字列パラメータ内の文字の数を示します。
- ParamType プロパティ -- 選択されたパラメータの型を示します。これは、ptInput(入力パラメータの場合)、ptOutput(出力パラメータの場合)、ptInputOutput(入出力パラメータの場合)、ptResult(結果パラメータの場合)のいずれかになります。
- Value プロパティ -- 選択されたパラメータの値を指定します。出力パラメータと結果パラメータの値は設定できません。これらの種類のパラメータについては、ストアド プロシージャの実行により値が設定されます。入力パラメータと入出力パラメータについては、実行時にアプリケーションでパラメータ値を指定する場合は、Value を空のままにしておくことができます。
データセットで Parameters プロパティ(一連の TParameter オブジェクト)を使用している場合は、次のプロパティを正しく指定する必要があります。
- Name プロパティ -- ストアド プロシージャで定義されているとおりにパラメータの名前を示します。
- DataType プロパティ -- パラメータ値のデータ型を示します。一部のデータ型については、次のような補足的な情報を指定する必要があります。
- NumericScale プロパティ -- 数値パラメータの小数点以下の桁数を示します。
- Precision プロパティ -- 数値パラメータの全桁数を示します。
- Size プロパティ -- 文字列パラメータ内の文字の数を示します。
- Direction プロパティ -- 選択されたパラメータの型を示します。これは、pdInput(入力パラメータの場合)、pdOutput(出力パラメータの場合)、pdInputOutput(入出力パラメータの場合)、pdReturnValue(結果パラメータの場合)のいずれかになります。
- Attributes プロパティ -- パラメータが受け取る値の型を制御します。Attributes には、psSigned、psNullable、psLong の組み合わせを設定できます。
- Value プロパティ -- 選択されたパラメータの値を指定します。出力パラメータと結果パラメータの値は設定しないでください。入力パラメータと入出力パラメータについては、実行時にアプリケーションでパラメータ値を指定する場合は、Value を空のままにしておくことができます。
実行時のパラメータの使用
一部のデータセットでは、実行時までストアド プロシージャの名前が指定されない場合、パラメータ用の TParam オブジェクトは自動的には作成されず、プログラムで作成する必要があります。それには TParam.Create メソッドか TParams.AddParam メソッドを使用します。
var P1, P2: TParam; begin ... with StoredProc1 do begin StoredProcName := 'GET_EMP_PROJ'; Params.Clear; P1 := TParam.Create(Params, ptInput); P2 := TParam.Create(Params, ptOutput); try Params[0].Name := 'EMP_NO'; Params[1].Name := 'PROJ_ID'; ParamByname('EMP_NO').AsSmallInt := 52; ExecProc; Edit1.Text := ParamByname('PROJ_ID').AsString; finally P1.Free; P2.Free; end; end; ... end;
TParam *P1, *P2; StoredProc1->StoredProcName = "GET_EMP_PROJ"; StoredProc1->Params->Clear(); P1 = new TParam(StoredProc1->Params, ptInput); P2 = new TParam(StoredProc1->Params, ptOutput); try { StoredProc1->Params->Items[0]->Name = "EMP_NO"; StoredProc1->Params->Items[1]->Name = "PROJ_ID"; StoredProc1->ParamByName("EMP_NO")->AsSmallInt = 52; StoredProc1->ExecProc(); Edit1->Text = StoredProc1->ParamByName("PROJ_ID")->AsString; } __finally { delete P1; delete P2; }
実行時に個々のパラメータ オブジェクトを追加する必要がなくても、個々のパラメータ オブジェクトにアクセスして、入力パラメータに値を割り当てたり、出力パラメータから値を取得する場合はあるでしょう。データセットの ParamByName メソッドを使用して、名前を基に個々のパラメータにアクセスすることができます。たとえば、次のコードでは、入出力パラメータの値を設定し、ストアド プロシージャを実行して、戻り値を取得しています。
with SQLStoredProc1 do begin ParamByName('IN_OUTVAR').AsInteger := 103; ExecProc; IntegerVar := ParamByName('IN_OUTVAR').AsInteger; end;
SQLDataSet1->ParamByName("IN_OUTVAR")->AsInteger = 103; SQLDataSet1->ExecSQL(); int Result = SQLDataSet1->ParamByName("IN_OUTVAR")->AsInteger;