この章では、.NETストアド・ファンクションの開発およびデプロイ方法を具体例に従って説明します。
この章は次のトピックで構成されています。
参照: 前述のコンポーネントの詳細は、Oracle Developer Tools for Visual Studio .NETヘルプを参照してください。 |
このデモでは、Oracle Developer Tools for Visual Studio .NETのみを使用しますが、一部のプロセスは他のOracleツールを使用して実行できます。また、このデモではOracle Developer Tools for Visual Studio .NETの次のコンポーネントを参照しています。
Oracle Explorer
Oracle Project
Oracle Deployment Wizard for .NET
このデモでは、GetDeptNo
という.NETストアド・ファンクションを開発し、PL/SQLラッパーGETDEPTNO
とともにデプロイします。GetDeptNo
ファンクションは、従業員番号(EMPNO
)を受け入れて問合せを実行し、従業員の部門番号(DEPTNO
)を戻します。
このデモは、Visual Studio .NETを開き、ファンクションを作成してアセンブリに組み込むことから始まります。
Visual Studio .NETを開き、scott/tiger
として接続します。接続方法は、Oracle Developer Tools for Visual Studio .NETヘルプを参照してください。
Visual Studio .NETメニューから「ファイル」→「新規プロジェクト」を選択します。
Oracle Projectテンプレートを作成するには、プロジェクト・タイプVisual C#プロジェクトを選択し、Oracle Projectを選択します。
プロジェクト名としてCLRLibrary1
を指定し、位置を指定します。
クラスCLRLibrary1.Class1
が表示されます。このクラスには、ストアド・プロシージャ用のテンプレートが含まれています。
次のコードをコピーし、ベース・クラスに上書きして保存します。
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
「ビルド」メニューから「ソリューションのビルド」または「CLRLibrary1のビルド」を選択します。
これにより、コードがアセンブリに組み込まれます。
作業内容を保存します。
「ビルド」メニューからOracle Deployment Wizard for .NETを起動できます。
「ビルド」メニューから「CLRLibrary1の配置」を選択します。
「ようこそ」ウィンドウが表示されると、必要に応じて「このページを再表示しない」を選択します。
「次へ」をクリックします。
「OracleConnectionを構成」ウィンドウが表示されます。
ドロップダウン・リストから接続を選択して「次へ」をクリックするか、接続していない場合は「新規接続」をクリックします。
SYSBA
接続を選択または追加する必要があります。
「新規接続」を選択した場合は、「接続の追加」ウィンドウが表示されます。
「接続詳細」タブで、ドロップダウン・リストからデータ・ソース名を選択します。「Windows統合認証を使用」オプションまたは「固有のユーザー名とパスワードを使用」オプションを選択し、該当する情報を入力できます。必要な場合は、「パスワードを保存」を選択します。「ロール」には使用可能な唯一のオプションであるSYSDBA
が表示されます。接続をテストする場合は、「接続テスト」をクリックします。最後に「OK」をクリックします。
「デプロイ・オプションを指定」ウィンドウが表示されます。
デプロイ・ウィザードを初めて実行するときには、「アセンブリのコピーおよびストアド・プロシージャの生成」を選択します。後でファンクションまたはストアド・プロシージャを変更する場合は、デプロイ・ウィザードを再実行して、これらの操作の1つのみを実行するように選択できます。「次へ」をクリックします。
アセンブリとライブラリ名の指定ウィンドウが表示されます。
アセンブリを指定するには、ドロップダウン・リストからプロジェクトを選択するか、「ファイル」を選択して「参照」をクリックし、必要なプロジェクトにナビゲートします。
選択したアセンブリに使用するライブラリ・データベース・オブジェクトの名前を指定するには、デフォルトを受け入れるか、ドロップダウン・リストから名前を選択するか、または新しい名前を入力します。
このデモでは、デフォルトのプロジェクトとライブラリ名を受け入れて「次へ」をクリックします。
コピー・オプションの指定ウィンドウが表示されます。
データベースにコピーする依存アセンブリを指定するには、リストから選択します。このリストには、依存アセンブリの候補がすべて表示されます。この場合、表示されるアセンブリはデータベースにコピー済であるため、コピーする必要はありません。アセンブリをデフォルトのbin\clr
以外のディレクトリにデプロイするには、コピー先パスを変更します。コピー先には、bin\clr
ディレクトリまたは既存のサブディレクトリの1つを指定する必要があります。
このデモでは、依存アセンブリを選択せず、コピー先パスを変更しないでください。
必要な場合は、「データベースにファイルがすでに存在する場合は上書き」を選択します。
「次へ」をクリックします。
メソッドとセキュリティ詳細の指定ウィンドウが表示されます。
デプロイ対象となるプロジェクト全体を選択するか、展開して特定のファンクションをデプロイするように選択できます。このプロジェクトにはファンクションが1つしかないため、項目を1つ選択するとプロジェクト全体が選択されます。複数のファンクションまたはプロシージャがある場合は、デプロイする項目を個別に選択できます。
デプロイ対象として他のスキーマを選択する場合は、このウィンドウで選択できます。必要なスキーマが表示されない場合は、別のフィルタを適用する必要があります。このプロセスの詳細は、Oracle Developer Tools for Visual Studio .NETヘルプを参照してください。
ドロップダウン・リストを使用してセキュリティ・レベルを設定できます。設定可能なレベルは次のとおりです。
Safe (デフォルト)
External
Unsafe
このデモでは、次の手順で操作します。
選択したアセンブリに含まれるプロシージャとファンクションのリストから、「GetDeptNo()
」を選択します。
スキーマは、最初はSYS
と表示されます。scott
スキーマにデプロイできるように、SYS
をScott
に変更します。
デフォルトのセキュリティ・レベルを受け入れます。「次へ」をクリックして続行するか、「パラメータ・タイプのマッピング」をクリックすることで型マッピングを表示できます。
「パラメータ・タイプのマッピング」を選択した場合は、「パラメータ・タイプのマッピング」ウィンドウが表示され、ドロップダウン・リストを使用してデータ型を変更できます。
このデモでは、.NETデータ型System.Int32
からOracleのBINARY_INTEGER
型へのデフォルト・マッピングを受け入れます。
「OK」をクリックしてメソッドとセキュリティ詳細の指定ウィンドウに戻ります。
Oracle Deployment Wizard for .NETの「サマリー」ウィンドウが表示され、指定した内容がすべて表示されます。このウィンドウで「戻る」を選択すると任意の値を変更できます。
このデモを完了する手順は、次のとおりです。
この時点で、GetDeptNo()
ファンクションがOracleデータベースにデプロイされ、PL/SQLラッパー・ファンクションをコールしてテストする準備が完了したことになります。
このデモでは、ファンクションをコールするためにデフォルト・ユーザーscott
として接続する必要があります。
ファンクションを次のツールからコールしてテストします。
Oracle Developer Tools for Visual Studio .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
.NETファンクションであるGetDeptNo()
ファンクションをSQL* Plusからコールする手順は、次のとおりです。
SQL*Plusを起動し、パスワードtiger
を持つユーザーscott
としてログインします。
次のコマンドを入力します。
SET SERVEROUTPUT ON; DECLARE deptno BINARY_INTEGER; BEGIN deptno := GetDeptNo(7934); DBMS_OUTPUT.PUT_LINE(deptno); END;
または、次の文を実行する方法もあります。
SELECT GetDeptNo(7934) FROM DUAL;