- PR -

VB.NETからPL/SQLをキックをするときにDate型引数を渡すには?

1
投稿者投稿内容
未記入
会議室デビュー日: 2006/11/07
投稿数: 3
投稿日時: 2006-11-07 18:47
下記のような方法でOracleへの接続、PL/SQLの起動を行っています。
引数を"2006/01/01"として、投げているのですが、エラーが発生してしまいます。
datetime関数なども試してみましたが、エラーは出てしまいました。

PL/SQL側をNumberやCharとして受け取ると、問題なくPL/SQLが起動するので、
構文は問題ないものと思っています。どなたか、Date型への値の引渡し方法を
知っている方がいらっしゃいましたら、ご教授お願い申し上げます。

Dim OraCnn As New OracleConnection
'--
Dim sb As New System.Text.StringBuilder
sb.Append("User Id=xxxx; Password=xxxx;")
sb.Append("Data Source=(DESCRIPTION = (ADDRESS_LIST = ")
sb.Append("(ADDRESS = (PROTOCOL = TCP)(HOST = XXX)")
sb.Append("(PORT = 1521)))(CONNECT_DATA = (SERVER = DEDICATED)")
sb.Append("(SERVICE_NAME = XXX)));")
OraCnn.ConnectionString = sb.ToString
'--接続のオープン
OraCnn.Open()
'--PL/SQL呼び出し
Dim OraCmd As New OracleCommand
OraCmd.Connection = OraCnn
OraCmd.CommandText = "xxxxxx"
OraCmd.CommandType = CommandType.StoredProcedure
'--引数
Dim param As OracleParameter = OraCmd.Parameters.Add("PARA_DATE",OracleDbType.date)
param.Direction = ParameterDirection.Input
param.Value = "2006/01/01"
'--戻り値
Dim Rtn As OracleParameter = OraCmd.Parameters.Add("Rtn",OracleDbType.Int32)
Rtn.Direction = ParameterDirection.ReturnValue
'ストアド実行
OraCmd.ExecuteNonQuery()
'接続のクローズ
OraCnn.Close()

環境:
 端末  WindowsXPSP2+VB2003+ODP.NET+Oracle10gClientRelease2
 Server Windows2003+Oracle10gRelease2

[ メッセージ編集済み 編集者: 未記入 編集日時 2006-11-07 19:29 ]
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2006-11-07 19:53
NAL-6295です。

どんなエラーが発生するのでしょうか?
それが分かるともう少し適切な回答をすることができると思いますが、
たぶん

引用:

未記入さんの書き込み (2006-11-07 18:47) より:
'--引数
Dim param As OracleParameter = OraCmd.Parameters.Add("PARA_DATE",OracleDbType.date)
param.Direction = ParameterDirection.Input
param.Value = "2006/01/01"



このvalueにString型の値を渡していますが、DateTime型で渡すと解決するのではないかと推測します。

引用:

param.Value = New DateTime(2006,1,1)



こんな感じで。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-11-07 19:54
引用:

未記入さんの書き込み (2006-11-07 18:47) より:

datetime関数なども試してみましたが、エラーは出てしまいました。


datetime 関数ってのは .NET の DateTime構造体 のこととして、
DateTime.Now とかを代入しても例外が発生したということですか?
このときも同じ例外が出ましたか?

また、 Oracle の Package 定義がどうなっているのかわからないのですが、
仮引数は Date または TimeStamp 型になっていますか?


引用:

'--引数
'--戻り値


あれ?? BindByName を True にしないときは
戻り値って先に積んであげなければいけなかったような。。。
未記入
会議室デビュー日: 2006/11/07
投稿数: 3
投稿日時: 2006-11-07 20:46
NAL-6295さま、かるあさま、早速の返信ありがとうざいます。

環境が職場ですので、エラーメッセージなどはしっかりチェックしてきます。
まずはお二方に提示していただいた方法で試してみたいと思います。

引用:


あれ?? BindByName を True にしないときは
戻り値って先に積んであげなければいけなかったような。。。




とのことですが、BindByNameという言葉を始めて聞きました。
レベルが低くてお恥ずかしいですが、ちょっと調べてみたいと思います。

あとPL/SQL側は、

create or replace function xxxx(
  PARA_DATE  IN DATE
) Return Number is

となっていたはずです。
それでは、結果が分かりましたらご報告させていただきます。
未記入
会議室デビュー日: 2006/11/07
投稿数: 3
投稿日時: 2006-11-07 22:24
解決の報告です。
待ちきれなく、自宅でほぼ同じ環境を作成し、
実行してみました。

エラー内容は下記メッセージです。
------------------------------------------------------------------
ORA-06550: 行1、列15:
PLS-00306:'xxx'の呼び出しで、引数の数または型が正しくありません。
ORA-06550: 行1、列7:
PL/SQL: Statement ignored
------------------------------------------------------------------

これを踏まえまして、param.Value = New DateTime(2006,1,1)
と記述したところ、見事引数を渡すことが出来ました。
NAL-6295さまありがとうございました。

また、BindByName=True指定をしてあげたところ、
param.Value = "2006/01/01"でも、PL/SQLが無事動くことが出来ました。
かるあさまありがとうございました。

お二方のご協力で無事PL/SQLのキックが出来るようになりました。
的確なアドバイスありがとうございました。

[ メッセージ編集済み 編集者: 未記入 編集日時 2006-11-07 22:25 ]

[ メッセージ編集済み 編集者: 未記入 編集日時 2006-11-07 22:27 ]
1

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