VB.NETからODP.NET経由でOracle Functionのキック
Procedure Callの手法はいっぱいあるんだけど、Function Callの情報がなくて四苦八苦。
結論。
たとえば
CREATE OR REPLACE FUNCTION KTBU.ofTest(aDate IN CHAR, aSCd IN CHAR) RETURN NUMBER IS BEGIN RETURN 0; END; /
ってFunctionがあった場合、こいつをキックするには
Private Sub btnExec_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnExec.Click
Dim pConn As OracleConnection
Dim blnRet As Boolean
' pConnのOpenは省略
Dim pCmd As New OracleCommand("", pConn)
pCmd.CommandText = "BEGIN :aRet := ofTest(:aDate, :aSCd); END;"
pCmd.CommandType = CommandType.Text
Dim pParamR As OracleParameter = _
New OracleParameter("aRet", OracleDbType.Int16)
pParamR.Direction = ParameterDirection.ReturnValue
pCmd.Parameters.Add(pParamR)
Dim pParam1 As OracleParameter = _
New OracleParameter("aDate", OracleDbType.Char)
pParam1.Direction = ParameterDirection.Input
pParam1.Value = "12345678"
pCmd.Parameters.Add(pParam1)
Dim pParam2 As OracleParameter = _
New OracleParameter("aSCd", OracleDbType.Char)
pParam2.Direction = ParameterDirection.Input
pParam2.Value = "1234"
pCmd.Parameters.Add(pParam2)
Try
pCmd.ExecuteNonQuery()
Catch ex As Exception
Debug.WriteLine(ex.Message)
End Try
lblResult.Text = CType(pParamR.Value, String)
pCmd.Dispose()
'pConnのCloseは省略
End Sub
元ネタはART BREAKERS(あぶれ)(Mark44.さん)の[プログラミングTips]-[.NETおぼえがき
(俺メモ)]-[Oracle9iのストアドファンクションを利用する]と、OTN Forumsのスレッド[stored procedure - odp.net - vb.net]から。
私の環境では
CommandType = CommandType.StoredProcedure
だとどーしてもFunctionがキックできなくて、
CommandType = CommandType.Text
にした上で
CommandText = "BEGIN :aRet := ofTest(:aDate, :aSCd); END;"
ってことですね。
…なぜだ。