VB.NET, C#, PowerShellを使用しているエンジニアのためのサイト。
基本的な使用方法から開発で役立つTipsまで幅広く取り扱っています。
その3では引数ありのストアドプロシージャのOUTパラメータを受け取る方法を紹介しました。
今回は、REF CURSORをOUT引数として持つストアドプロシージャをC#で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パラメータをC#から指定する方法はその2で説明した通りです。
今回は、ストアドプロシージャのOUTパラメータをC#のDataReaderに受け取る方法について説明します。
まず、ストアドプロシージャのIN引数に渡す値の設定を行います。このサンプルでは"in_EMPNO","in_ENAME","in_DEPTNO"の3つです。
ストアドプロシージャのOUT引数ですが、OleDBでは指定することができません。(指定はできませんが、OUT引数の結果はDataReaderにセットされます)
あとはDataReaderを作成し、Readメソッドを使用することで、1レコードずつ処理をすることができます。
using System.Data.OleDb; private void OleDB_TEST4() { try { using (OleDbConnection OraConn = new OleDbConnection("Provider=MSDAORA.1.Oracle;user id=scott;" + " password=tiger;data source=aicnet01")) { using (OleDbCommand Cmd = new OleDbCommand()) { //データベース接続を開く OraConn.Open(); Cmd.Connection = OraConn; //コマンドタイプをストアドプロシージャにする Cmd.CommandType = CommandType.StoredProcedure; //実行するストアドプロシージャを指定 Cmd.CommandText = "PKG_TEST1.PROCEDURE4"; //ストアドプロシージャの引数に渡す値の設定 Cmd.Parameters.Add("in_EMPNO", OleDbType.VarChar).Value = "7777"; Cmd.Parameters.Add("in_ENAME", OleDbType.VarChar).Value = "HIRO"; Cmd.Parameters.Add("in_DEPTNO", OleDbType.Decimal).Value = 20; OleDbDataReader OraRead; OraRead = Cmd.ExecuteReader(); listBox1.Items.Clear(); //データの取り出し while (OraRead.Read()) listBox1.Items.Add(OraRead.GetString(OraRead.GetOrdinal("ENAME"))); MessageBox.Show( "PROCEDURE4 正常終了", "SUCCESS", MessageBoxButtons.OK, MessageBoxIcon.Information); } } } catch (OleDbException OraEx) { // Oracle例外発生時 MessageBox.Show(OraEx.Message, "ORACLE ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop); } catch (Exception ex) { // 一般例外発生時 MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop); } }