HIRO's.NET

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

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

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

HIRO's.NET RSSHIRO's.NET RSS


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

HOME > C# 2005 Tips > その他 Tips メニュー> ストアド操作 OracleClient編 Tips メニュー

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

UPDATE:2007/04/20 

<< 前のTips  次の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に受け取る方法について説明します。

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

 
サンプル
using System.Data.OracleClient;

private void OracleClient_TEST4()
{
    try
    {
        using (OracleConnection OraConn = 
            new OracleConnection("user id=scott;password=tiger;data source=aicnet01"))
        {
            using (OracleCommand Cmd = 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用パラメータ作成
                OracleParameter outPara = new OracleParameter("out_CURSOR", OracleType.Cursor);
                outPara.Direction = ParameterDirection.Output;
                Cmd.Parameters.Add(outPara);

                OracleDataReader 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 (OracleException OraEx)
    {
        // Oracle例外発生時
        MessageBox.Show(OraEx.Message, "ORACLE ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
    }
    catch (Exception ex)
    {
        // 一般例外発生時
        MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop);
    }
}