今回は以下の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.