ヘッダーをスキップ
Oracle Database Extensions for .NET開発者ガイド
11g リリース1(11.1)
E05792-01
  目次へ
目次
索引へ
索引

戻る
戻る
 
次へ
次へ
 

4 .NETストアド・ファンクションの開発およびデプロイのデモ

この章では、.NETストアド・ファンクションの開発およびデプロイ方法を具体例に従って説明します。

この章は次のトピックで構成されています。


参照:

前述のコンポーネントの詳細は、Oracle Developer Tools for Visual Studio .NETヘルプを参照してください。

.NETストアド・ファンクション・デモの概要

このデモでは、Oracle Developer Tools for Visual Studio .NETのみを使用しますが、一部のプロセスは他のOracleツールを使用して実行できます。また、このデモではOracle Developer Tools for Visual Studio .NETの次のコンポーネントを参照しています。

このデモでは、GetDeptNoという.NETストアド・ファンクションを開発し、PL/SQLラッパーGETDEPTNOとともにデプロイします。GetDeptNoファンクションは、従業員番号(EMPNO)を受け入れて問合せを実行し、従業員の部門番号(DEPTNO)を戻します。

ステップ1: GetDeptNoファンクションの作成とアセンブリへの組込み

このデモは、Visual Studio .NETを開き、ファンクションを作成してアセンブリに組み込むことから始まります。

  1. Visual Studio .NETを開き、scott/tigerとして接続します。接続方法は、Oracle Developer Tools for Visual Studio .NETヘルプを参照してください。

  2. Visual Studio .NETメニューから「ファイル」「新規プロジェクト」を選択します。

  3. Oracle Projectテンプレートを作成するには、プロジェクト・タイプVisual C#プロジェクトを選択し、Oracle Projectを選択します。

  4. プロジェクト名としてCLRLibrary1を指定し、位置を指定します。

    クラスCLRLibrary1.Class1が表示されます。このクラスには、ストアド・プロシージャ用のテンプレートが含まれています。

    OracleProject.gifの説明は次にあります。
    画像の説明

  5. 次のコードをコピーし、ベース・クラスに上書きして保存します。

    using System;
    // use the ODP.NET provider
    using Oracle.DataAccess.Client;
    using Oracle.DataAccess.Types;
    
    namespace CLRLibrary1
    {
      // Sample .NET stored function returning department number for
      // a given employee number
      public class Class1
      {
        public static int GetDeptNo(int empno)
        {
          int deptno = 0;
    
          // Check for context connection
          OracleConnection conn = new OracleConnection();
          if( OracleConnection.IsAvailable == true )
          {
            conn.ConnectionString = "context connection=true";
          }
          else
          {
            throw new InvalidOperationException("context connection" +
              "not available");
          }
    
          conn.Open();
          // Create and execute a command
          OracleCommand cmd = conn.CreateCommand();
          cmd.CommandText = "SELECT DEPTNO FROM EMP WHERE EMPNO = :1";
    
          cmd.Parameters.Add(":1",OracleDbType.Int32,empno,
            System.Data.ParameterDirection.Input);
    
          OracleDataReader rdr = cmd.ExecuteReader();
    
          if (rdr.Read())
            deptno = rdr.GetInt32(0);
    
          rdr.Close();
          cmd.Dispose();
          conn.Close();
    
          return deptno;
    
        } // GetDeptNo
      } // Class1
    } // CLRLibrary1
    
    
  6. 「ビルド」メニューから「ソリューションのビルド」または「CLRLibrary1のビルド」を選択します。

    これにより、コードがアセンブリに組み込まれます。

  7. 作業内容を保存します。

ステップ2: Oracle Deployment Wizard for .NETの起動

「ビルド」メニューからOracle Deployment Wizard for .NETを起動できます。

  1. 「ビルド」メニューから「CLRLibrary1の配置」を選択します。

    deployMenu.gifの説明は次にあります。
    画像の説明

  2. 「ようこそ」ウィンドウが表示されると、必要に応じて「このページを再表示しない」を選択します。

    「次へ」をクリックします。

    TitlePage.gifの説明は次にあります。
    画像の説明

  3. 「OracleConnectionを構成」ウィンドウが表示されます。

    ドロップダウン・リストから接続を選択して「次へ」をクリックするか、接続していない場合は「新規接続」をクリックします。

    SYSBA接続を選択または追加する必要があります。

    usingDeploywizard1.gifの説明は次にあります。
    画像の説明

  4. 「新規接続」を選択した場合は、「接続の追加」ウィンドウが表示されます。

    「接続詳細」タブで、ドロップダウン・リストからデータ・ソース名を選択します。「Windows統合認証を使用」オプションまたは「固有のユーザー名とパスワードを使用」オプションを選択し、該当する情報を入力できます。必要な場合は、「パスワードを保存」を選択します。「ロール」には使用可能な唯一のオプションであるSYSDBAが表示されます。接続をテストする場合は、「接続テスト」をクリックします。最後に「OK」をクリックします。

    SYSDBAaddConnection.gifの説明は次にあります。
    画像の説明

  5. 「デプロイ・オプションを指定」ウィンドウが表示されます。

    デプロイ・ウィザードを初めて実行するときには、「アセンブリのコピーおよびストアド・プロシージャの生成」を選択します。後でファンクションまたはストアド・プロシージャを変更する場合は、デプロイ・ウィザードを再実行して、これらの操作の1つのみを実行するように選択できます。「次へ」をクリックします。

    usingDeploywizard2.gifの説明は次にあります。
    画像の説明

  6. アセンブリとライブラリ名の指定ウィンドウが表示されます。

    アセンブリを指定するには、ドロップダウン・リストからプロジェクトを選択するか、「ファイル」を選択して「参照」をクリックし、必要なプロジェクトにナビゲートします。

    選択したアセンブリに使用するライブラリ・データベース・オブジェクトの名前を指定するには、デフォルトを受け入れるか、ドロップダウン・リストから名前を選択するか、または新しい名前を入力します。

    このデモでは、デフォルトのプロジェクトとライブラリ名を受け入れて「次へ」をクリックします。

    usingDeploywizard3.gifの説明は次にあります。
    画像の説明

  7. コピー・オプションの指定ウィンドウが表示されます。

    データベースにコピーする依存アセンブリを指定するには、リストから選択します。このリストには、依存アセンブリの候補がすべて表示されます。この場合、表示されるアセンブリはデータベースにコピー済であるため、コピーする必要はありません。アセンブリをデフォルトのbin\clr以外のディレクトリにデプロイするには、コピー先パスを変更します。コピー先には、bin\clrディレクトリまたは既存のサブディレクトリの1つを指定する必要があります。

    このデモでは、依存アセンブリを選択せず、コピー先パスを変更しないでください。

    必要な場合は、「データベースにファイルがすでに存在する場合は上書き」を選択します。

    「次へ」をクリックします。

    CopyOptions.gifの説明は次にあります。
    画像の説明

ステップ3: デプロイするファンクションの選択

メソッドとセキュリティ詳細の指定ウィンドウが表示されます。

デプロイ対象となるプロジェクト全体を選択するか、展開して特定のファンクションをデプロイするように選択できます。このプロジェクトにはファンクションが1つしかないため、項目を1つ選択するとプロジェクト全体が選択されます。複数のファンクションまたはプロシージャがある場合は、デプロイする項目を個別に選択できます。

デプロイ対象として他のスキーマを選択する場合は、このウィンドウで選択できます。必要なスキーマが表示されない場合は、別のフィルタを適用する必要があります。このプロセスの詳細は、Oracle Developer Tools for Visual Studio .NETヘルプを参照してください。

ドロップダウン・リストを使用してセキュリティ・レベルを設定できます。設定可能なレベルは次のとおりです。

このデモでは、次の手順で操作します。

  1. 選択したアセンブリに含まれるプロシージャとファンクションのリストから、「GetDeptNo()」を選択します。

  2. スキーマは、最初はSYSと表示されます。scottスキーマにデプロイできるように、SYSScottに変更します。

  3. デフォルトのセキュリティ・レベルを受け入れます。「次へ」をクリックして続行するか、「パラメータ・タイプのマッピング」をクリックすることで型マッピングを表示できます。

    specifyMethodDetails.gifの説明は次にあります。
    画像の説明

ステップ4: 適切なパラメータ型マッピングの判別

「パラメータ・タイプのマッピング」を選択した場合は、「パラメータ・タイプのマッピング」ウィンドウが表示され、ドロップダウン・リストを使用してデータ型を変更できます。

このデモでは、.NETデータ型System.Int32からOracleのBINARY_INTEGER型へのデフォルト・マッピングを受け入れます。

「OK」をクリックしてメソッドとセキュリティ詳細の指定ウィンドウに戻ります。


参照:

データ型マッピングの表は、「データ型変換」を参照してください。

DatatypeMapping.gifの説明は次にあります。
画像の説明

ステップ5: Oracle Databaseへのファンクションのデプロイ

Oracle Deployment Wizard for .NETの「サマリー」ウィンドウが表示され、指定した内容がすべて表示されます。このウィンドウで「戻る」を選択すると任意の値を変更できます。

このデモを完了する手順は、次のとおりです。

  1. サマリーを検討します。

  2. SQLコマンドを確認するには、「スクリプトを表示」を選択します。

    summary.gifの説明は次にあります。
    画像の説明

  3. 「SQL表示」ウィンドウが表示された時点で、PL/SQLラッパーのコードを確認し、「OK」をクリックして「サマリー」ウィンドウに戻ります。

    ShowSqlDialog.gifの説明は次にあります。
    画像の説明

  4. 「終了」をクリックしてGetDeptNo()ファンクションをデプロイします。

ステップ6: ファンクションのテスト

この時点で、GetDeptNo()ファンクションがOracleデータベースにデプロイされ、PL/SQLラッパー・ファンクションをコールしてテストする準備が完了したことになります。

このデモでは、ファンクションをコールするためにデフォルト・ユーザーscottとして接続する必要があります。

ファンクションを次のツールからコールしてテストします。

Oracle Developer Tools for Visual Studio .NETからのコール

Oracle Developer Tools for Visual Studio .NETでファンクションを検索してコールする手順は、次のとおりです。

  1. 「表示」メニューから「Oracle エクスプローラ」を選択します。

  2. 「ファンクション」ノードを開きます。

  3. GETDEPTNOを探します。

  4. GETDEPTNOを右クリックし、メニューから「実行」を選択します。

    runSP.gifの説明は次にあります。
    画像の説明

  5. 表示される「ファンクションを実行」ダイアログ・ボックスに、入力値として従業員番号7934を入力します。

    runFunction.gifの説明は次にあります。
    画像の説明

  6. 「OK」をクリックします。

    「ドキュメント」ウィンドウに出力値10が表示されます。これは、従業員番号7934が部門10に属していることを示します。

    success.gifの説明は次にあります。
    画像の説明

ODP.NETクライアントからのコール

次のコード例に、.NETファンクションのPL/SQLラッパーの起動方法を示します。

using System;
using System.Data;
using Oracle.DataAccess.Client;

namespace ODPNETClientApp
{
  public class Class1
  {
    public static void Main()
    {
      int empno  = 7934;
      int deptno = 0;

      try
      {
        // Open a connection to the database
        OracleConnection con = new OracleConnection(
          "User Id=scott; Password=tiger; Data Source=inst1");
        con.Open();

        // Create and execute the command
        OracleCommand cmd = con.CreateCommand();
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "GETDEPTNO";

        // Set parameters
        OracleParameter retParam = cmd.Parameters.Add(":DEPTNO",
            OracleDbType.Int32, System.Data.ParameterDirection.ReturnValue);
        cmd.Parameters.Add(":EMPNO", OracleDbType.Int32, empno,
        System.Data.ParameterDirection.Input);

        cmd.ExecuteNonQuery();
        deptno = (int)retParam.Value;

        Console.WriteLine("\nEmployee# {0} working in department# {1}\n",
          empno, deptno);

        cmd.Dispose();
        con.Close();
      }
      catch (Exception e)
      {
        Console.WriteLine(e.Message);
      }
    }
  } // Class1
} // ODPNETClientApp namespace

SQL*Plusからのコール

.NETファンクションであるGetDeptNo()ファンクションをSQL* Plusからコールする手順は、次のとおりです。

  1. SQL*Plusを起動し、パスワードtigerを持つユーザーscottとしてログインします。

  2. 次のコマンドを入力します。

    SET SERVEROUTPUT ON;
    DECLARE
    deptno BINARY_INTEGER;
    BEGIN
      deptno := GetDeptNo(7934);
      DBMS_OUTPUT.PUT_LINE(deptno);
    END;
    
    

または、次の文を実行する方法もあります。

SELECT GetDeptNo(7934) FROM DUAL;



参照:

  • Oracle Developer Tools for Visual Studio .NETヘルプ

  • 『Oracle Data Provider for .NET開発者ガイド』

  • 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』

  • 『Oracle Database SQL Language Reference』