HIRO's.NET

VB.NET, C#, PowerShell Tipsサイト

 VB.NET, C#, PowerShellを使用しているエンジニアのためのサイト。

 基本的な使用方法から開発で役立つTipsまで幅広く取り扱っています。

HIRO's.NET RSSHIRO's.NET RSS


VB.NET 2005の開発でお困りのことはありませんか?
そんな悩みは当サイトで解決!!

HOME > VB.NET 2005 Tips > その他 Tips メニュー> ストアド操作 ODP.NET編 Tips メニュー

04.ストアドプロシージャ操作 その4

UPDATE:2007/04/20 

<< 前のTips  次のTips >>

 


その3では引数ありのストアドプロシージャのOUTパラメータを受け取る方法を紹介しました。
今回は、REF CURSORをOUT引数として持つストアドプロシージャをVB.NETでDataReaderに受け取る方法を紹介します。

使用するテーブルは、Oracleを使用している人であればおなじみの、scott/tigerのEMP表です。

ストアドプロシージャは下記の通りです。
(例によって深い意味はありません。説明用です。)

■ストアドプロシージャ4
CREATE OR REPLACE PACKAGE SCOTT.PKG_TEST1
IS
TYPE ref_cursor IS REF CURSOR;
Procedure PROCEDURE4(in_EMPNO IN VARCHAR2, in_ENAME IN VARCHAR2, in_DEPTNO IN NUMBER, out_cursor OUT ref_cursor);
END;
/

CREATE OR REPLACE PACKAGE BODY SCOTT.PKG_TEST1 AS
Procedure PROCEDURE4 (
    in_EMPNO in varchar2,
    in_ENAME in varchar2,
    in_DEPTNO in number,
    out_CURSOR OUT ref_cursor
)
IS
    varSQL varchar2(2000);
BEGIN
    INSERT INTO EMP (EMPNO, ENAME, DEPTNO) VALUES (in_EMPNO, in_ENAME, in_DEPTNO);
    -- open cursor
    varSQL := 'SELECT * FROM EMP WHERE DEPTNO=' || in_DEPTNO;
    OPEN out_CURSOR FOR varSQL;
END PROCEDURE4;
END PKG_TEST1;
/

 ストアドプロシージャのINパラメータをVB.NETから指定する方法はその2で説明した通りです。
 今回は、ストアドプロシージャのOUTパラメータをVB.NETのDataReaderに受け取る方法について説明します。

 まず、OracleParameterのインスタンスを作成します。
 OracleParameterのインスタンス作成時の第1引数には、ストアドプロシージャのREF CUROSOR(OUT引数)名(この場合は"out_cursor")、第2引数にはストアドプロシージャOUT引数の型に合わせたものを指定します。(OracleDbType.RefCursor)
 次に、PrameterDirectionにOutputを指定します。(これはストアドプロシージャout_cursorがOUT引数であるため)
 あとはDataReaderを作成し、Readメソッドを使用することで、1レコードずつ処理をすることができます。

 
サンプル
Imports Oracle.DataAccess.Client

Private Sub ODP_TEST4()
    Try
        Using OraConn As New OracleConnection("user id=scott;password=tiger;data source=YourServer")
            Using Cmd As New OracleCommand
                'データベース接続を開く
                OraConn.Open()
                Cmd.Connection = OraConn
                'コマンドタイプをストアドプロシージャにする
                Cmd.CommandType = CommandType.StoredProcedure
                '実行するストアドプロシージャを指定
                Cmd.CommandText = "PKG_TEST1.PROCEDURE4"
                'ストアドプロシージャの引数に渡す値の設定
                Cmd.Parameters.Add("in_EMPNO", OracleDbType.Varchar2).Value = "7777"
                Cmd.Parameters.Add("in_ENAME", OracleDbType.Varchar2).Value = "HIRO"
                Cmd.Parameters.Add("in_DEPTNO", OracleDbType.Decimal).Value = 20
                'ストアドプロシージャのout cursor用パラメータ作成
                Dim outPara As New OracleParameter("out_CURSOR", OracleDbType.RefCursor)
                outPara.Direction = ParameterDirection.Output
                Cmd.Parameters.Add(outPara)

                Dim OraRead As OracleDataReader
                OraRead = Cmd.ExecuteReader

                ListBox1.Items.Clear()
                'データの取り出し
                While OraRead.Read
                    ListBox1.Items.Add(OraRead.GetString(OraRead.GetOrdinal("ENAME")))
                End While

                MessageBox.Show("PROCEDURE4 正常終了", "SUCCESS", _
                    MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Using
        End Using

    Catch OraEx As OracleException
        'Oracle例外発生時
        MessageBox.Show(OraEx.Message, "ORACLE ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop)

    Catch ex As Exception
        '一般例外発生時
        MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop)
    End Try
End Sub