連載
» 2006年03月07日 00時00分 公開

VB.NETで楽々Oracleストアド・プロシージャ作成.NETでOracleアプリを作ろう(5)(3/4 ページ)

[小海友和,日本オラクル]

手順3 LOBデータをアンロードするプロシージャの作成

 次に格納されたLOBデータを取り出すためのプロシージャ(Unload_LOB)を続けて作成します(リスト5)。このプロシージャは、格納されているデータのファイル名(filename)とLOBデータの出力先(out_dir)を渡して実行されることで、指定した出力先にLOBデータをファイル名として出力します。

Public Shared Sub Unload_LOB(ByVal filename As String, _
  ByVal out_dir As String)

    ' 接続
    Dim conn As New OracleConnection("context connection=true")

    ' 実行するSQL文
    Dim sqlStr As String = _
      "SELECT image FROM blob_tbl WHERE name = '" + filename + "'"

    ' OracleCommandの作成
    Dim cmd As New OracleCommand(sqlStr, conn)

    conn.Open()
    Dim dr As OracleDataReader = cmd.ExecuteReader
    If dr.Read Then
        Dim blob As OracleBlob = dr.GetOracleBlob(0)

        ' ファイル出力のためにFileStreamを作成
        Dim fs As FileStream = New FileStream( _
          out_dir + "\" + filename, FileMode.OpenOrCreate, _
          FileAccess.Write)
        'FileStreamでLOBデータを書き出す
        fs.Write(blob.Value, 0, blob.Length)
        'FileStreamのクローズ
        fs.Close()
    End If
    conn.Close()

End Sub
リスト5 Unload_LOBプロシージャ(VB.NET)

 このプロシージャでは、データベースへ接続後、OracleDataReaderでBLOBデータを読み出し、そのデータをFileStreamを用いて、指定のディレクトリにファイルとして書き出します。

 BLOBデータのファイルへの書き出しも、PL/SQLパッケージとして用意されている「dbms_lob」を使用したPL/SQLブロックを作成することで可能ですが、長く複雑なものになってしまいます。

 単純なデータアクセスだけの場合、パフォーマンスなどの点でPL/SQLストアド・プロシージャに多くのメリットがありますが、ファイルへの入出力や、複雑な計算を要する場合などでは、プログラミング言語としての慣れのほかにも.NETストアド・プロシージャにメリットを見いだせるケースも多いでしょう。

デプロイと実行

.NETストアド・プロシージャのデプロイ

 Load_LOBとUnload_LOBのコードを記述した後、「ビルド」?「ソリューションの配置」をクリックしてOracle Deployment Wizard for .NETを起動し、.NETストアド・プロシージャをデプロイします。この際、「メソッドおよびセキュリティ詳細を指定」では、スキーマとして「SCOTT」、セキュリティは「外部」を指定します。これらのプロシージャは、ローカルファイルへ入出力を行いますので「外部」を指定する必要があります。

図4 Oracle Deployment Wizard for .NETでセキュリティは「外部」を指定 図4 Oracle Deployment Wizard for .NETでセキュリティは「外部」を指定

.NETストアド・プロシージャの実行

 デプロイが無事完了したら、.NETストアド・プロシージャを実行してみましょう。.NETストアド・プロシージャは、Oracleエクスプローラより実行することもできますが、PL/SQLストアド・プロシージャと同様、SQL*Plusからの実行やほかのアプリケーションからの呼び出しも可能です。

 リスト6は、SQL*Plusでの実行例です。まず、C:\SOURCEというディレクトリに10g.gifというファイルを用意します。Load_LOBプロシージャを使用して10g.gifファイルをデータベースに格納します。その後、Unload_LOBプロシージャを使用して、データベースに格納されているLOBデータをC:\OUTディレクトリに出力しています。

SQL> EXEC LOAD_LOB('C:\SOURCE\10g.gif')

PL/SQLプロシージャが正常に完了しました。

SQL> select name from blob_tbl;

NAME
--------------------
10g.gif

SQL> EXEC UNLOAD_LOB('10g.gif', 'C:\OUT');

PL/SQLプロシージャが正常に完了しました。
リスト6 SQL*PlusでLoad_LOB、Unload_LOBの実行

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。