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(); } }
例