Oracle® Database Extensions for .NET開発者ガイド 11gリリース2 (11.2) for Microsoft Windows B61359-02 |
|
前 |
次 |
この章では、.NETストアド・ファンクションの開発およびデプロイ方法を具体例に従って説明します。
この章の内容は次のとおりです。
関連項目: これらのコンポーネントの詳細は、Oracle Developer Tools for Visual Studioヘルプを参照してください |
このデモでは、Oracle Developer Tools for Visual Studioのみを使用しますが、一部のプロセスは他のOracleツールを使用して実行できます。また、このデモではOracle Developer Tools for Visual Studioの次のコンポーネントを参照します。
Oracleエクスプローラ
Oracle Project
Oracle Deployment Wizard for .NET
このデモでは、GetDeptNo
という.NETストアド・ファンクションを開発し、PL/SQLラッパーGETDEPTNO
とともにデプロイします。GetDeptNo
ファンクションは、従業員番号(EMPNO
)を受け入れて問合せを実行し、従業員の部門番号(DEPTNO
)を戻します。
このデモは、Visual Studioを開き、ファンクションを作成してアセンブリに組み込むことから始まります。
Visual Studioを開き、scott/
password
として接続します。接続方法は、Oracle Developer Tools for Visual Studioヘルプを参照してください。
Visual Studioメニューから「File」、「New Project」の順に選択します。
Oracle Projectテンプレートを作成するには、プロジェクト・タイプVisual C#プロジェクトを選択し、Oracleプロジェクトを選択します。
プロジェクト名として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ヘルプを参照してください。
ドロップダウン・リストを使用してセキュリティ・レベルを設定できます。設定可能なレベルは次のとおりです。
安全(デフォルト)
外部
危険
このデモでは、次を行います。
選択したアセンブリに含まれるプロシージャとファンクションのリストから、GetDeptNo()
を選択します。
スキーマは、最初はSYS
と表示されます。scott
スキーマにデプロイできるように、これをScott
に変更します。
デフォルトのセキュリティ・レベルを受け入れます。「次へ」をクリックして続行するか、「パラメータ・タイプ・マッピング...」をクリックすることで型マッピングを表示できます。
「パラメータ・タイプ・マッピング...」を選択した場合は、パラメータ・タイプ・マッピング・ウィンドウが表示され、ドロップダウン・リストを使用してデータ型を変更できます。
このデモでは、.NETデータ型System.Int32
からOracleのBINARY_INTEGER
型へのデフォルト・マッピングを受け入れます。
「OK」をクリックしてメソッドおよびセキュリティ詳細の指定ウィンドウに戻ります。
Oracle Deployment Wizard for .NETのサマリー・ウィンドウが表示され、指定した内容がすべて表示されます。このウィンドウで「戻る」を選択すると任意の値を変更できます。
このデモを完了するには、次を行います。
サマリーを検討します。
SQLコマンドを確認するには、「スクリプトの表示」を選択します。
SQLの表示ウィンドウが表示された時点で、PL/SQLラッパーのコードを確認し、「OK」をクリックしてサマリー・ウィンドウに戻ります。
「終了」をクリックしてGetDeptNo()
ファンクションをデプロイします。
この時点で、GetDeptNo()
ファンクションがOracleデータベースにデプロイされ、PL/SQLラッパー・ファンクションをコールしてテストする準備が完了したことになります。
このデモでは、ファンクションをコールするためにデフォルト・ユーザーscott
として接続する必要があります。
ファンクションを次のツールからコールしてテストします。
Oracle Developer Tools for Visual Studioでファンクションを検索してコールする手順は、次のとおりです。
「表示」メニューから、「Oracleエクスプローラ」を選択します。
「ファンクション」ノードを開きます。
GETDEPTNOを検索します。
GETDEPTNOを右クリックし、メニューから「実行」を選択します。
「ファンクションの実行」ダイアログ・ボックスが表示されたら、従業員番号7934を入力します。
「OK」をクリックします。
ドキュメント・ウィンドウに出力値10が表示されます。これは、従業員番号7934が部門10に属していることを示します。
次のコード例に、.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;
関連項目:
|