Top > Programmingとか > DB > DB小ネタ

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;"

ってことですね。

…なぜだ。

トラックバック

このエントリーのトラックバックURL:
http://salv.miscnotes.com/mt/mt-tb.cgi/145

コメントを投稿