プライマリ・コンテンツに移動

Oracle® Data Provider for .NET開発者ガイド ODAC 12.2c リリース1 (12.2.0.1) for Microsoft Windows E88311-03 |
| 目次 | 索引

前 | 次 |

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

例

関連項目:

- Oracle.DataAccess.ClientおよびOracle.ManagedDataAccess.Clientのネームスペース

- OracleCommandBuilderクラス

- OracleCommandBuilderメンバー

- OracleCommandクラス

- OracleParameterクラス

- OracleParameterCollectionクラス

- このMicrosoft .NET Framework 機能の詳細は、`http://msdn.microsoft.com/library`を参照