今回は以下の3つのストアドファンクションを作成します。
このようにOracleデータベース側で、正規表現やXMLファイルへのシリアライズといった.NET Frameworkのクラスを利用することができるのも、.NETストアドプロシージャの大きな利点といえます。
.NETストアドプロシージャを作成する前に、使用するEMP表に電子メールアドレスを格納するEMAIL列を追加します。OracleエクスプローラでEMP表を右クリックして[設計]を押下し(図7)、表1の内容を入力したらダイアログボックス右下の[保存]を押下します。
列名 | 型 | Default | 主キー |
---|---|---|---|
VARCHAR2 (20) | - | - | |
表1 EMP表への変更項目 |
Visual Studio 2005を起動し、[ファイル]メニューから[新しいプロジェクト]を選択します。テンプレート一覧から[Oracle Project]を選択し、プロジェクト名を入力したら[OK]をクリックして作成します(図8)。
.NETストアドプロシージャとしてデプロイするプロシージャやファンクションは、VB.NETの場合は「Public Shared」、C#の場合は「public static」で宣言されている必要があります。
まず、クラスに正規表現チェックを行うためのSystem.Text.RegularExpressionsとプロバイダ・ファクトリクラスを使用するためのSystem.Data.Commonをインポートします(リスト2)。
Imports Oracle.DataAccess.Client Imports Oracle.DataAccess.Types Imports System.Text.RegularExpressions Imports System.Data.Common
次に正規表現を使って、正しい電子メールアドレス形式かを確認するParseEmailAddressをPublic Shared Functionとして実装します(リスト3)。
Public Shared Function ParseEmailAddress(ByVal eMail As String) _ As Integer Dim emailRegEx As New Regex("(\S+)@([^\.\s]+)(?:\.([^\.\s]+))+") Dim m As Match = emailRegEx.Match(eMail) If m.Success Then Return 1 Else Return 0 End If End Function
続いて正規表現チェック後に電子メールアドレスをEMP表に登録するEmailRegisterを記述します。接続元からデータベース接続情報を引き継ぐため、「context connection=true」という設定を行っています。この記述で、接続元からトランザクションも引き継ぐことが可能です(リスト4)。
Public Shared Function EmailRegister(ByVal empNo As Integer, _ ByVal eMail As String) As Integer Dim sql As String Try '正規表現チェック If ParseEmailAddress(eMail) = 0 Then Return 0 End If Dim conn As New OracleConnection("context connection=true") conn.Open() Dim cmd As New OracleCommand cmd.Connection = conn cmd.CommandType = CommandType.Text 'パラメータはバインド変数で渡す sql = "Update EMP set " sql &= " EMAIL= :EMAIL" sql &= " Where EMPNO = :EMPNO" cmd.CommandText = sql 'パラメータ定義 Dim prmEMAIL As New OracleParameter prmEMAIL.Value = eMail cmd.Parameters.Add(prmEMAIL) Dim prmEMPNO As New OracleParameter prmEMPNO.Value = empNo cmd.Parameters.Add(prmEMPNO) '戻り値は行数(0は失敗) Return cmd.ExecuteNonQuery() Catch ex As Exception Return 0 End Try End Function
最後に、EMP表をXMLファイルとして出力するSerializeEmpDataを記述します(リスト5)。
Public Shared Function SerializeEmpData() As Integer Dim sql As String Try Dim conn As New OracleConnection("context connection=true") conn.Open() Dim cmd As New OracleCommand cmd.Connection = conn cmd.CommandType = CommandType.Text sql = "select * from emp " cmd.CommandText = sql Dim da As New OracleDataAdapter Dim ds As New DataSet da.SelectCommand = cmd da.Fill(ds) '出力先は環境に応じて変更してください ds.WriteXml("C:\emp.xml") Return 1 Catch ex As Exception Return 0 End Try End Function
Copyright © ITmedia, Inc. All Rights Reserved.