前回(その2)は引数あり(IN引数のみ)のストアドプロシージャをVB.NETから呼び出す方法を紹介しました。
今回は、OUT引数があるストアドプロシージャをVB.NETから呼び出す方法を紹介します。
開発言語:VB.NET 2005
使用するテーブルは、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);
SELECT COUNT(*) into out_TOTALCNT FROM EMP;
END;
/
以下、ODP.NET, MicorosoftのOracleClient, OleDB の3種類を使用してPROCEDURE3を呼び出す例です。
ストアドプロシージャのINパラメータをVB.NETから指定する方法は前回説明した通りです。
今回は、ストアドプロシージャのOUTパラメータをVB.NETから受け取る方法について説明します。
まず、OracleParameterのインスタンスを作成します。(OleDBの場合は、OleDbParameterのインスタンス)
OracleParameterのインスタンス作成時の第1引数には、ストアドプロシージャのOUT引数名(この場合は"out_TOTALCNT")、第2引数にはストアドプロシージャOUT引数の型に合わせたものを指定します。(今回の場合、OracleのNumber型に対して、ODP.NETの場合はOracleDbType.Decimal、OracleClientの場合はOracleType.Number、OleDBの場合はOleDbType.Decimalを指定します。)
次に、PrameterDirectionをOutputを指定します。(これはストアドプロシージャout_TOTALCNTがOUT引数であるため)
値の取得方法ですが、ExecuteNonQueryメソッド実行後に、OraclePrameterのValueプロパティを参照します。
■ODP.NETサンプル
Private Sub ODP_TEST3()
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 = "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
Dim outPara As 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)
End Using
End Using
Catch OraEx As OracleException
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
■OracleClientサンプル
Private Sub OracleClient_TEST3()
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 = "PROCEDURE3"
Cmd.Parameters.Add("in_EMPNO", OracleType.VarChar).Value = "7777"
Cmd.Parameters.Add("in_ENAME", OracleType.VarChar).Value = "HIRO"
Cmd.Parameters.Add("in_SAL", OracleType.Number).Value = 500
Dim outPara As New System.Data.OracleClient.OracleParameter("out_TOTALCNT", OracleType.Number)
outPara.Direction = ParameterDirection.Output
Cmd.Parameters.Add(outPara)
Cmd.ExecuteNonQuery()
MessageBox.Show("PROCEDURE3 正常終了 COUNT=" & outPara.Value.ToString(), "SUCCESS", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Using
End Using
Catch OraEx As OracleException
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
■OleDBサンプル
Private Sub OleDB_TEST3()
Try
Using OraConn As New OleDbConnection("Provider=MSDAORA.1.Oracle;user id=scott;password=tiger;data source=YourServer")
Using Cmd As New OleDbCommand
OraConn.Open()
Cmd.Connection = OraConn
Cmd.CommandType = CommandType.StoredProcedure
Cmd.CommandText = "PROCEDURE3"
Cmd.Parameters.Add("in_EMPNO", OleDbType.VarChar).Value = "7777"
Cmd.Parameters.Add("in_ENAME", OleDbType.VarChar).Value = "HIRO"
Cmd.Parameters.Add("in_SAL", OleDbType.Decimal).Value = 500
Dim outPara As New OleDbParameter("out_TOTALCNT", OleDbType.Decimal)
outPara.Direction = ParameterDirection.Output
Cmd.Parameters.Add(outPara)
Cmd.ExecuteNonQuery()
MessageBox.Show("PROCEDURE3 正常終了 COUNT=" & outPara.Value.ToString(), "SUCCESS", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Using
End Using
Catch OleEx As OleDbException
MessageBox.Show(OleEx.Message, "OleDB ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop)
Catch ex As Exception
MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop)
End Try
End Sub