- PR -

vb2008からRacleパッケージ呼び出しで戻り値取得時にエラーとなる

1
投稿者投稿内容
コウジ
ベテラン
会議室デビュー日: 2006/12/18
投稿数: 54
投稿日時: 2008-07-15 22:44
いつもお世話になります。

VB2008からOracleパッケージを呼び出すと実行はうまくいっているようですが
戻り値取得でエラーとなってしまいます。

vbソース
cmd.Connection = OraDatabase2
cmd.CommandText = "PKG_JUCHU_TORIKOMI.RDATA02"
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Clear()
cmd.Parameters.Add(New OracleParameter("PARA_WSID", OracleDbType.Varchar2)). _
Direction = ParameterDirection.Input
cmd.Parameters("PARA_WSID").Value = Trim(ComputerName)
cmd.Parameters.Add(New OracleParameter("Ret", OracleDbType.Decimal, _
1, DBNull.Value, ParameterDirection.Output))

Dim vERRM As Integer

Try
cmd.ExecuteNonQuery() 'ストアド実行
vERRM = cmd.Parameters("Ret").Value '<--戻り値取得 ここでエラーとなる
  Catch OraEx As OracleException
'Oracle例外発生時
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

パッケージ仕様部(仕様部・BODY部ともにコンパイルエラーはなし)
procedure RDATA02(PARA_WSID in VARCHAR2, -- 端末ID
Ret out NUMBER -- 戻り値
);

上記の「'<--戻り値取得 ここでエラー」部分で型変換エラーとなるのですが、
ならば、と思いいろいろやってみましたが、上記ソースの型指定部分を以下のようにいろいろ変えてやってみても・・・

「Dim vERRM As String」「OracleDbType.Decimal」で実行すると
--> oracledecimalから型'string'への変換は無効です。
「Dim vERRM As Integer」「OracleDbType.Decimal」
--> oracledecimalから型'ingteger'への変換は無効です。
「Dim vERRM As Integer」「OracleDbType.int16」
--> oracledecimalから型'ingteger'への変換は無効です。

とエラーとなってしまいます。ちなみにリターンコードは数値0です。
なにか勘違いをしていますでしょうか?

ちなみにsql/plusから実行すると正常終了します。
SQL> var Ret number;
SQL> begin
2 PKG_JUCHU_TORIKOMI.RDATA02('PC01',:Ret);
3 end;
4 /

PL/SQL procedure successfully completed.

SQL> print :Ret

RET
----------
0


皆さんはどうしてらっしゃいます?
ご添削の程よろしくお願いいたします。



[ メッセージ編集済み 編集者: コウジ 編集日時 2008-07-15 23:11 ]
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-07-16 09:46
引用:

コウジさんの書き込み (2008-07-15 22:44) より:

「Dim vERRM As String」「OracleDbType.Decimal」で実行すると
--> oracledecimalから型'string'への変換は無効です。
「Dim vERRM As Integer」「OracleDbType.Decimal」
--> oracledecimalから型'ingteger'への変換は無効です。
「Dim vERRM As Integer」「OracleDbType.int16」
--> oracledecimalから型'ingteger'への変換は無効です。


エラーメッセージの通り、cmd.Parameters("Ret").Value の中に入っているのは OracleDecimal型の値ですので、vERRM の型も同じにしてあげましょう。
代入した後、vERRM.Value プロパティで Decimal型の値を取得できます。
あとはそのまま使うなり、Decimal.ToInt32() メソッドで Integer型にするなりご随意に。

参考URL(バージョンがわからないけどそう大きくは違わないはず)
http://otndnld.oracle.co.jp/document/products/oracle10g/102/windows/B31247-01/OracleDecimalStructure.htm
コウジ
ベテラン
会議室デビュー日: 2006/12/18
投稿数: 54
投稿日時: 2008-07-16 18:59
rainさん、ご回答ありがとうございました。

VB側に「OracleDecimal」なんて型定義があったんですね・・・
知りませんでした。

おかげで解決しました。
本当にありがとうございました。
1

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