DeriveParameters
このメソッドは、指定したOracleCommandで表されるストアド・プロシージャまたは関数のパラメータに対する問合せを実行し、その戻り値をコマンドのOracleParameterCollectionに移入します。
宣言
// C#
public static void DeriveParameters(OracleCommand command);
パラメータ
-
commandパラメータが導出されるストアド・プロシージャまたは関数を表すコマンド
例外
InvalidOperationException - CommandTextがストアド・プロシージャまたは関数の有効な名前でないか、CommandTypeがCommandType.StoredProcedureでないか、Connection.StateがConnectionState.Openではありません。
備考
DeriveParametersを使用して、ストアド・ファンクションを表すOracleCommandオブジェクトのParameterコレクションを移入すると、このファンクションの戻り値が最初のパラメータ(OracleParameterCollectionの位置0)としてバインドされます。
DeriveParametersを使用できるのはストアド・プロシージャまたは関数に対してのみであり、無名PL/SQLブロックに対しては使用できません。
DeriveParametersを使用すると、ストアド・プロシージャ/ファンクションの実行前にパラメータのメタデータを取得するためのデータベース・ラウンドトリップが発生します。これを使用するのは設計時のみにしてください。本番環境での不必要なデータベース・ラウンドトリップを避けるには、設計時にDeriveParametersメソッドにより戻された明示的なパラメータ設定でDeriveParametersメソッド自体を置き換えるようにしてください。
DeriveParametersでストアド・プロシージャ名または関数名の大/小文字の区別が保持されるのは、名前が二重引用符で囲まれている場合のみです。たとえば、データベース内のストアド・プロシージャの名前が大/小文字の混在したGetEmployeesである場合、OracleCommandオブジェクトのCommandTextプロパティは、次の例のように適切に設定する必要があります。
cmd.CommandText = "\"GetEmployees\"";
パッケージ内のストアド・プロシージャおよび関数は、次の書式で指定する必要があります。
<package name>.<procedure or function name>
たとえば、EmpProcedures(大/小文字が混在)というパッケージ内のGetEmployees(大/小文字が混在)というストアド・プロシージャのパラメータを取得する場合、OracleCommandに指定する名前は次のとおりです。
"\"EmpProcedures\".\"GetEmployees\""
DeriveParameterをオブジェクト型のメソッドに使用することはできません。
導出されるパラメータには、ストアド・プロシージャを正しく実行するのに必要なすべてのメタデータ情報が含まれています。必要な場合は、アプリケーションで実行の前にパラメータの値を指定する必要があります。またアプリケーションでは、実行前にパラメータのメタデータ情報が変更される場合があります。たとえば、ストアド・プロシージャの実行を最適化するために、OracleParameterのSizeプロパティがPL/SQLのCHARおよびSTRING型に変更されます。
導出されるパラメータの出力値は、デフォルトでは.NETタイプとして戻されます。出力パラメータをプロバイダ・タイプとして取得するには、パラメータのOracleDbTypeプロパティをアプリケーションで明示的に設定して、このデフォルト動作をオーバーライドする必要があります。これを簡単に行う1つの方法として、プロバイダ・タイプとして戻す必要のある出力パラメータのすべてで、OracleDbTypeをそれ自体に設定するという方法があります。
指定したOracleCommandのBindByNameプロパティはそのまま残されますが、アプリケーションでその値を変更することができます。
指定したストアド・プロシージャまたは関数がオーバーロードの場合は、パラメータ・コレクションへの移入に最初のオーバーロードが使用されます。
// Database Setup
/*
connect scott/tiger@oracle
CREATE OR REPLACE PROCEDURE MyOracleStoredProc (arg_in IN VARCHAR2,
arg_out OUT VARCHAR2) IS
BEGIN
arg_out := arg_in;
END;
/
*/
// C#
using System;
using System.Data;
using Oracle.DataAccess.Client;
class DeriveParametersSample
{
static void Main()
{
// Create the PL/SQL Stored Procedure MyOracleStoredProc as indicated in
// the preceding Database Setup
string constr = "User Id=scott;Password=tiger;Data Source=oracle";
OracleConnection con = new OracleConnection(constr);
con.Open();
// Create an OracleCommand
OracleCommand cmd = new OracleCommand("MyOracleStoredProc", con);
cmd.CommandType = CommandType.StoredProcedure;
// Derive Parameters
OracleCommandBuilder.DeriveParameters(cmd);
Console.WriteLine("Parameters Derived");
// Prints "Number of Parameters for MyOracleStoredProc = 2"
Console.WriteLine("Number of Parameters for MyOracleStoredProc = {0}",
cmd.Parameters.Count);
// The PL/SQL stored procedure MyOracleStoredProc has one IN and
// one OUT parameter. Set the Value for the IN parameter.
cmd.Parameters[0].Value = "MyText";
// The application may modify the other OracleParameter properties also
// This sample uses the default Size for the IN parameter and modifies
// the Size for the OUT parameter
// The default size for OUT VARCHAR2 is 4000
// Prints "cmd.Parameters[1].Size = 4000"
Console.WriteLine("cmd.Parameters[1].Size = " + cmd.Parameters[1].Size);
// Set the Size for the OUT parameter
cmd.Parameters[1].Size = 6;
// Execute the command
cmd.ExecuteNonQuery();
// Prints "cmd.Parameters[1].Value = MyText"
Console.WriteLine("cmd.Parameters[1].Value = " + cmd.Parameters[1].Value);
con.Close();
con.Dispose();
}
}
例