ヘッダーをスキップ
Oracle Database Extensions for .NET開発者ガイド
11gリリース1(11.1.0.6.20)
E06105-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を開き、ファンクションを作成してアセンブリに組み込むことから始まります。

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

  2. Visual Studioメニューから「File」「New Project」の順に選択します。

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

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

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

    OracleProject.gifの説明が続きます
    図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の説明が続きます
    図deployMenu.gifの説明

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

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

    TitlePage.gifの説明が続きます
    図TitlePage.gifの説明

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

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

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

    usingDeploywizard1.gifの説明が続きます
    図usingDeploywizard1.gifの説明

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

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

    SYSDBAaddConnection.gifの説明が続きます
    図SYSDBAaddConnection.gifの説明

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

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

    usingDeploywizard2.gifの説明が続きます
    図usingDeploywizard2.gifの説明

  6. アセンブリおよびライブラリ名を指定しますウィンドウが表示されます。

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

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

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

    usingDeploywizard3.gifの説明が続きます
    図usingDeploywizard3.gifの説明

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

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

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

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

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

    CopyOptions.gifの説明が続きます
    図CopyOptions.gifの説明

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

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

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

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

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

このデモでは、次を行います。

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

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

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

    specifyMethodDetails.gifの説明が続きます
    図specifyMethodDetails.gifの説明

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

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

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

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


関連項目:

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

DatatypeMapping.gifの説明が続きます
図DatatypeMapping.gifの説明

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

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

このデモを完了するには、次を行います。

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

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

    summary.gifの説明が続きます
    図summary.gifの説明

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

    ShowSqlDialog.gifの説明が続きます
    図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の説明が続きます
    図runSP.gifの説明

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

    runFunction.gifの説明が続きます
    図runFunction.gifの説明

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

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

    success.gifの説明が続きます
    図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リファレンス