- PR -

ストアドプロシージャの戻り値取得方法

1
投稿者投稿内容
がんばり屋
会議室デビュー日: 2003/12/02
投稿数: 12
投稿日時: 2005-01-06 16:03
OS:Windows XP
言語:VB.net

いつもお世話になります。
ORACLEにパッケージを作り.NETからそれを呼び出したいのですが、
戻り値をセットすると下記のようなエラーがでます。
「引数の数または型が正しくありません。」

引数の数、型共に確認しましたが合っているようです。
そこで戻り値なしと戻り値有りの2種類のパッケージを作成し、
実行してみると戻り値なしの方は正常に処理されました。

戻り値の書き方がおかしいのでしょうか?
ご教授いただけないでしょうか?

パッケージの一部
--------------------------------------------------------
PROCEDURE ACCESS_LOG_INS(
pUSER_ID IN VARCHAR2,
pSEARCH_CON IN VARCHAR2,
pIP_ADDRESS IN VARCHAR2,
pACTION_FLAG IN VARCHAR2,
pPROJECT_ID IN VARCHAR2,
pFUNCTION_ID IN VARCHAR2,
pERRM OUT VARCHAR2) IS

・・・・
--------------------------------------------------------


ストアドの呼び出し
--------------------------------------------------------
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "ZIDT_WEB_LOG_GET_PKG.ACCESS_LOG_INS"

'引数・戻り値の定義
cmd.Parameters.Clear()
cmd.Parameters.Add(New OracleParameter("pUSER_ID", OracleDbType.Varchar2)).Direction = ParameterDirection.Input
cmd.Parameters.Add(New OracleParameter("pSEARCH_CON", OracleDbType.Varchar2)).Direction = ParameterDirection.Input
cmd.Parameters.Add(New OracleParameter("pIP_ADDRESS", OracleDbType.Varchar2)).Direction = ParameterDirection.Input
cmd.Parameters.Add(New OracleParameter("pACTION_FLAG", OracleDbType.Varchar2)).Direction = ParameterDirection.Input
cmd.Parameters.Add(New OracleParameter("pPROJECT_ID", OracleDbType.Varchar2)).Direction = ParameterDirection.Input
cmd.Parameters.Add(New OracleParameter("pFUNCTION_ID", OracleDbType.Varchar2)).Direction = ParameterDirection.Input
cmd.Parameters.Add(New OracleParameter("pERRM", OracleDbType.Varchar2)).Direction = ParameterDirection.ReturnValue

'引数のセット
cmd.Parameters("pUSER_ID").Value = Session("USER_ID")
cmd.Parameters("pSEARCH_CON").Value = "test"
cmd.Parameters("pIP_ADDRESS").Value = "test"
cmd.Parameters("pACTION_FLAG").Value = "S"
cmd.Parameters("pFUNCTION_ID").Value = "S1"
cmd.Parameters("pPROJECT_ID").Value = "DOM_SALES_INFO"

'ストアド実行
cmd.ExecuteNonQuery()

'戻り値取得
vERRM = cmd.Parameters("pERRM").Value.ToString
--------------------------------------------------------

Os_
ベテラン
会議室デビュー日: 2003/04/16
投稿数: 77
投稿日時: 2005-01-06 16:41
ストアドプロシージャのパラメータ指定で
pERRM はOUTの指定になっていますが、

'引数・戻り値の定義では、ストアドプロシージャの戻り値指定になっています。
cmd.Parameters.Add(New OracleParameter("pERRM", OracleDbType.Varchar2)).Direction = ParameterDirection.ReturnValue

両者で整合性がとれていないのでエラーになっているのではないですか?
OUT指定が正しいのであれば、

cmd.Parameters.Add(New OracleParameter("pERRM", OracleDbType.Varchar2)).Direction = ParameterDirection.Output

とすべきではないですか?
がんばり屋
会議室デビュー日: 2003/12/02
投稿数: 12
投稿日時: 2005-01-07 08:54
Os_様 返信ありがとうございます。

ReturnValueにする前はOutputとしておりましたが
「数値または値のエラー: : 文字列バッファが小さすぎます」
というエラーが出ましたのでここのレビューを検索し、
ReturnValueに変えた次第でございます。

.NETからではなくsqlプラスなどでこのストアドを実行すると
戻り値:vERRM には'OK'が返って来ます。

パッケージ側には問題はないと思っているのですが
いかがでしょうか?
Os_
ベテラン
会議室デビュー日: 2003/04/16
投稿数: 77
投稿日時: 2005-01-07 10:12
Oracleに詳しくないので、推量ですが、

>「数値または値のエラー: : 文字列バッファが小さすぎます」
のエラーメッセージから、
OracleParameterのSize指定では?

>パッケージ側には問題はないと思っているのですが
この問題は、
ストアドプロシージャのパラメータの構成とOracleCommandとの整合性の問題かと思います。
アリババ
会議室デビュー日: 2002/10/28
投稿数: 12
投稿日時: 2005-01-07 10:16
私も以前同じような現象に悩まされていました。
のようにパラメーターを設定すると戻り値を取得できるようになりました。VARCHAR2やCHARではストアドプロシージャー内での変数の領域の確保が出来ていないみたいで戻り値をセットしたらエラーになってストアドが落ちていました。
がパラメーターに文字列のサイズとDBNull.Valueの2項目を追加すると戻り値を取得できるようになりました。
C#で申し訳ないのですが
OracleParameter("ERRMSG",OracleDbType.Varchar2,4000,DBNull.Value,ParameterDirection.Output)
これを参考にVB.NETに変更すれば動作すると思います。


がんばり屋
会議室デビュー日: 2003/12/02
投稿数: 12
投稿日時: 2005-01-07 14:21
Os_様、アリババ様、返信ありがとうございます。
仰る通り、サイズの指定とOutputにすることで問題が解決しました☆
本当にありがとうございました。

cmd.Parameters.Add(New OracleParameter("pERRM", OracleDbType.Varchar2, 4000)).Direction = ParameterDirection.Output
1

スキルアップ/キャリアアップ(JOB@IT)