VB.NET, C#, PowerShellを使用しているエンジニアのためのサイト。
基本的な使用方法から開発で役立つTipsまで幅広く取り扱っています。
その4では、REF CURSORをOUT引数として持つストアドプロシージャをVB.NETでDataReaderに受け取る方法を紹介しました。
今回は、REF CURSOR(OUT引数)をVB.NETでDataSetに受け取る方法を紹介します。
使用するテーブルは、Oracleを使用している人であればおなじみの、scott/tigerのEMP表です。
ストアドプロシージャは下記の通りです。もらった引数をINSERT文で書き込み、書き込み後のEMP表総件数をout_TOTALCNTにセットします。
(例によって深い意味はありません。説明用です。)
■ストアドプロシージャ5
CREATE OR REPLACE PACKAGE SCOTT.PKG_TEST2
IS
TYPE ref_cursor IS REF CURSOR;
Procedure PROCEDURE5(out_cursor OUT ref_cursor);
END;
/
CREATE OR REPLACE PACKAGE BODY SCOTT.PKG_TEST2 AS
Procedure PROCEDURE5 (
out_cursor OUT ref_cursor
)
IS
BEGIN
BEGIN
OPEN out_cursor FOR
SELECT * FROM EMP;
END;
END PROCEDURE5;
END PKG_TEST2;
/
今回は、ストアドプロシージャのOUTパラメータをVB.NETのDataSetに受け取る方法について説明します。
まず、OracleParameterのインスタンスを作成します。
OracleParameterのインスタンス作成時の第1引数には、ストアドプロシージャのREF CUROSOR(OUT引数)名(この場合は"out_cursor")、第2引数にはストアドプロシージャOUT引数の型に合わせたものを指定します。(OracleType.Cursor)
次に、PrameterDirectionにOutputを指定します。(これはストアドプロシージャout_cursorがOUT引数であるため)
あとはDataAdaptertとDataSetを作成し、DataAdapterのFillメソッドを使用することで、DataSetに結果を受け取ることができます。
Private Sub OracleClient_TEST5() Try Using OraConn As New OracleConnection("user id=scott;password=tiger;data source=aicnet01") Using Cmd As New OracleCommand 'データベース接続を開く OraConn.Open() Cmd.Connection = OraConn 'コマンドタイプをストアドプロシージャにする Cmd.CommandType = CommandType.StoredProcedure '実行するストアドプロシージャを指定 Cmd.CommandText = "PKG_TEST2.PROCEDURE5" 'ストアドプロシージャのout cursor用パラメータ作成 Dim outPara As New OracleParameter("out_CURSOR", OracleType.Cursor) outPara.Direction = ParameterDirection.Output Cmd.Parameters.Add(outPara) Dim OraDA As New OracleDataAdapter(Cmd) Dim ds As New DataSet() OraDA.Fill(ds, "EMP") DataGridView1.DataSource = ds.Tables("EMP") MessageBox.Show("PROCEDURE5 正常終了", "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