VB.NET, C#, PowerShellを使用しているエンジニアのためのサイト。
基本的な使用方法から開発で役立つ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引数の型に合わせたものを指定します。(OracleType.Cursor)
次に、PrameterDirectionにOutputを指定します。(これはストアドプロシージャout_cursorがOUT引数であるため)
あとはDataReaderを作成し、Readメソッドを使用することで、1レコードずつ処理をすることができます。
Imports System.Data.OracleClient Private Sub OracleClient_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", OracleType.VarChar).Value = "7777" Cmd.Parameters.Add("in_ENAME", OracleType.VarChar).Value = "HIRO" Cmd.Parameters.Add("in_DEPTNO", OracleType.Number).Value = 20 'ストアドプロシージャのout cursor用パラメータ作成 Dim outPara As New OracleParameter("out_CURSOR", OracleType.Cursor) 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