この章の内容は次のとおりです。
.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は、OracleOracleHomeNameClrAgntという名前で「コントロール パネル」の「サービス」からアクセスできます。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」をクリックします。
