この章の内容は次のとおりです。
.NETストアド・プロシージャは、SQL文またはPL/SQL文を含む.NET言語で記述されたメソッドまたはプロシージャです。
カスタム・ストアド・プロシージャおよびファンクションは、C#やVB.NETなどの.NETに準拠した任意の言語を使用して記述できます。また、これらの.NETストアド・プロシージャは、他のPL/SQLストアド・プロシージャまたはJavaストアド・プロシージャと同様にデータベースで使用できます。.NETストアド・プロシージャは、PL/SQLパッケージ、プロシージャ、ファンクションおよびトリガーからコールできます。また、SQL文からコールすることも、PL/SQLプロシージャまたはファンクションをコールできる任意の場所からコールすることもできます。
この章の例を実行するには、Oracle Database Extensions for .NET(.NETストアド・プロシージャを記述できるデータベース・オプション)をデータベースにインストールして構成しておく必要があります。
この章では、.NETストアド・プロシージャをアプリケーションで使用およびデプロイする方法を説明します。
.NETストアド・プロシージャを使用するには、最初に共通言語ランタイム・エージェント(OraClrAgent
サービス)を開始する必要があります。このサービスはデフォルトでは開始されません。このサービスは、クライアント上ではなくOracle Database上にあることに注意してください。
注意: OraClrAgnt は、Oracle OracleHomeName ClrAgnt という名前で「コントロール パネル」の「サービス」からアクセスできます。OracleHomeName はOracleホームです。 |
共通言語ランタイム・サービスを開始するには、次の手順を実行します。
次に、SYSDBA
としてデータベース接続を作成する必要があります。これにより、Oracleプロジェクトをデプロイできるようになります。
注意: このタスクを実行するには、SYSDBA としての管理者権限が必要です。 |
注意: Enterprise Managerを使用してsys アカウントのパスワードを設定する場合は、『Oracle Database 2日でデータベース管理者』の管理者アカウントおよび管理者権限に関する項を参照してください。 |
ODTでデータベース接続を作成するには、次の手順を実行します。
「View」メニューから「Server Explorer」を選択します。
Server Explorerで、「Data Connections」を右クリックします。
「Add Connection」を選択します。
「Add Connection」ウィンドウが表示されたら、「Data source」に「Oracle Database (Oracle ODP.NET)」と表示されているかどうかを確認します。
表示されている場合は、手順6に進みます。
「Data source」に「Oracle Database (Oracle ODP.NET)」と表示されていない場合は、「Change」を選択します。
「Change Data Source」ウィンドウが表示されます。
「Oracle Database」を選択してから、「Oracle Data Provider for .NET」を選択します。
「Add Connection」ウィンドウでは、次のように指定します。
「User name」にはsys
と入力します。
「Password」には、sys
アカウントのロック解除および設定を行った管理者により設定されたパスワードを入力します。
Enterprise Managerを使用してsys
アカウントのパスワードを設定する場合は、『Oracle Database 2日でデータベース管理者』の管理者アカウントおよび管理者権限に関する項を参照してください。
「Role」がSysdba
に設定されていることを確認します。
「Connection name」は「Data source name」および「User name」の値から自動生成されます。
「Add Connection」ウィンドウで、「OK」をクリックします。
これで、「Server Explorer」ウィンドウにSYS.ORCL
接続が含まれます。
.NETでストアド・プロシージャを使用するには、ストアド・プロシージャを保持するための新しいOracleプロジェクトを最初に作成する必要があります。
.NETストアド・プロシージャ用のプロジェクトを作成するには、次の手順を実行します。
「File」メニューから「New」、「Project」の順に選択します。
「New Project」ダイアログ・ボックスが表示されます。
「Project Types」で、作成するプロジェクトの種類を選択します。
Visual C#:
「Visual C#」、「Database」の順に選択し、「Templates:」の下で「Oracle Project」を選択します。
「Name:」にHR_DeployStored_CS
と入力します。
Visual Basic:
「Other Languages」、「Visual Basic」、「Database」の順に選択し、「Templates:」の下で「Oracle Project」を選択します。
「Name:」にHR_DeployStored_VB
と入力します。
「Location:」にC:\HR_Projects
と入力します。
「OK」をクリックします。
これで、.NETストアド・プロシージャを作成する準備ができました。
.NETストアド・プロシージャを作成するには、次の手順を実行します。
「Solution View」で、プロジェクトの「Class1.cs」タブまたは「Class1.vb」タブを選択します。
「名前空間ディレクティブの追加」の説明に従って、言語ごとに次の名前空間ディレクティブを追加します。
Visual C#:
using Oracle.DataAccess.Client; using Oracle.DataAccess.Types;
Visual Basic:
Imports Oracle.DataAccess.Client Imports Oracle.DataAccess.Types
「参照の追加」の説明に従って、Oracle.DataAccess.dll
に参照を追加します。
次に示すように、getDepartmentno()
メソッドをClass1
宣言にコピーします。
Visual C#
public static int getDepartmentno(int employee_id) { int department_id = 0; // Get a connection to the db OracleConnection conn = new OracleConnection(); conn.ConnectionString = "context connection=true"; conn.Open(); // Create and execute a command OracleCommand cmd = conn.CreateCommand(); cmd.CommandText = "select department_id from employees where employee_id = :1"; cmd.Parameters.Add(":1", OracleDbType.Int32, employee_id, ParameterDirection.Input); OracleDataReader rdr = cmd.ExecuteReader(); while(rdr.Read()) department_id=rdr.GetInt32(0); rdr.Close(); cmd.Dispose(); // Return the employee's department number return department_id; }
Visual Basic:
Public Shared Function getDepartmentno(ByVal employee_id As Integer) As Integer Dim department_id As Integer = 0 ' Get a connection to the db Dim conn As OracleConnection = New OracleConnection() conn.ConnectionString = "context connection=true" conn.Open() ' Create and execute a command Dim cmd As OracleCommand = conn.CreateCommand() cmd.CommandText = "select department_id from employees where employee_id = :1" cmd.Parameters.Add(":1", OracleDbType.Int32, employee_id, ParameterDirection.Input) Dim rdr As OracleDataReader = cmd.ExecuteReader() While rdr.Read() department_id = rdr.GetInt32(0) End While rdr.Close() cmd.Dispose() ' Return the employee's department number Return department_id End Function
Class1
を保存します。
「Build」メニューから「Build Solution」を選択します。
正しくビルドされたことが「Output」ウィンドウに示されていることを確認し、このウィンドウを閉じます。
これまでの手順により、「.NETストアド・ファンクションおよびプロシージャの作成」で作成した.NETストアド・プロシージャをデプロイできる状態になっています。
.NETストアド・プロシージャをデプロイするには、次の手順を実行します。
「Build」メニューから「Deploy Solution」を選択します。
「.NET用のOracleデプロイメント・ウィザード」ウィンドウが表示されます。
「.NET用のOracleデプロイメント・ウィザード」ウィンドウで「次へ」をクリックします。
「OracleConnectionを構成します」ウィンドウで「次へ」をクリックします。
「デプロイメント・オプションを指定します」ウィンドウで、最初のオプション(「アセンブリをコピーしてストアド・プロシージャを生成」)が選択されていることを確認し、「次へ」をクリックします。
「アセンブリおよびライブラリ名を指定します」ウィンドウでデフォルトを受け入れ、「次へ」をクリックします。
「コピー・オプションの指定」ウィンドウでデフォルトを受け入れ、「次へ」をクリックします。
Visual Basic:
Visual Basicを使用している場合は、Microsoft.VisualBasic
アセンブリも参照アセンブリとして表示されます。
「メソッドおよびセキュリティ詳細の指定」ウィンドウで、「使用可能なメソッド」にある「HR_DeployStored_CS」または「HR_DeployStored_VB」を開き、「Class1」を開いて「getDepartmentno()」
メソッドを選択します。
「メソッドの詳細」で、スキーマ・リストから「HR」を選択します。
「次へ」をクリックします。
「サマリー」ウィンドウで「終了」をクリックします。
これで、前の項でデプロイした.NETストアド・プロシージャを実行する準備ができました。
.NETストアド・プロシージャを実行するには、次の手順を実行します。
Server Explorerで、HR.ORCL
接続をオープンします。「Functions」を開きます。「GETDEPARTMENTNO」
を右クリックして「Run」を選択します。
「Run Function」ウィンドウが表示されます。
「Run Function」ウィンドウで、「EMPLOYEE_ID」
の「Value」
に100
を入力します。
「OK」をクリックします。
部門の戻り値が90
であることを確認します。これは、EMPLOYEE_ID
100
は部門90に含まれると示します。
作成したばかりの.NETストアド・プロシージャは、Server Explorerから実行する他に、ODT問合せウィンドウを使用して実行することもできます。
Server ExplorerでHR.ORCL
スキーマを開きます。
「Functions」を開き、「GETDEPARTMENTNO」
を選択します。
右クリックして「Query Window」を選択します。
Select
getdepartmentno(100)
from
dual
と入力します。
ツールバーから「Execute」をクリックします。