VB.NET, C#, PowerShellを使用しているエンジニアのためのサイト。
基本的な使用方法から開発で役立つTipsまで幅広く取り扱っています。
その2では引数あり(IN引数のみ)のストアドプロシージャをC#から呼び出す方法を紹介しました。
今回は、OUT引数があるストアドプロシージャをC#から呼び出す方法を紹介します。
使用するテーブルは、Oracleを使用している人であればおなじみの、scott/tigerのEMP表です。
ストアドプロシージャは下記の通りです。もらった引数をINSERT文で書き込み、書き込み後のEMP表総件数をout_TOTALCNTにセットします。
(例によって深い意味はありません。説明用です。)
■ストアドプロシージャ3
CREATE OR REPLACE PROCEDURE SCOTT.PROCEDURE3(in_EMPNO in varchar2, in_ENAME in varchar2, in_SAL in number, out_TOTALCNT out number)
IS
BEGIN
INSERT INTO EMP (EMPNO, ENAME, SAL) VALUES (in_EMPNO, in_ENAME, in_SAL);
-- INSERT文実行後の総件数を取得する
SELECT COUNT(*) into out_TOTALCNT FROM EMP;
END;
/
ストアドプロシージャのINパラメータをVB.NETから指定する方法は前回説明した通りです。
今回は、ストアドプロシージャのOUTパラメータをC#から受け取る方法について説明します。
まず、OracleParameterのインスタンスを作成します。
OracleParameterのインスタンス作成時の第1引数には、ストアドプロシージャのOUT引数名(この場合は"out_TOTALCNT")、第2引数にはストアドプロシージャOUT引数の型に合わせたものを指定します。(OracleDbType.Decima)
次に、PrameterDirectionをOutputを指定します。(これはストアドプロシージャout_TOTALCNTがOUT引数であるため)
値の取得方法ですが、ExecuteNonQueryメソッド実行後に、OraclePrameterのValueプロパティを参照します。
using Oracle.DataAccess.Client; private void ODP_TEST3() { 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 = "PROCEDURE3"; //ストアドプロシージャの引数に渡す値の設定 Cmd.Parameters.Add("in_EMPNO", OracleDbType.Varchar2).Value = "7777"; Cmd.Parameters.Add("in_ENAME", OracleDbType.Varchar2).Value = "HIRO"; Cmd.Parameters.Add("in_SAL", OracleDbType.Decimal).Value = 500; //ストアドプロシージャのout用パラメータ作成 OracleParameter outPara = new OracleParameter("out_TOTALCNT", OracleDbType.Decimal); outPara.Direction = ParameterDirection.Output; Cmd.Parameters.Add(outPara); //ストアドプロシージャの実行 Cmd.ExecuteNonQuery(); MessageBox.Show( "PROCEDURE3 正常終了 COUNT=" + outPara.Value.ToString(), "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); } }