2

JavaWebアプリケーションからOracleのストアドプロシージャにリクエストを送信しています。このストアドプロシージャには、TimestampINパラメータがあります。

情報の移動方法は次のようなものです。

javaWebApp-}Webサービスクライアント-}ws-}ストアドプロシージャ

そして、タイムスタンプパラメータをフォーマットされた文字列としてWebサービスクライアントからwsに送信します。

テスト環境では、次の送信で機能します。

SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss a");
input.setTimestampField(dateFormat.format(new Date()));

ご覧のとおり、フォーマットされた文字列が送信されます。しかし、実稼働環境では、例外が発生します

ORA-01830: date format picture ends before converting entire input string.

これは、おそらく1つのDBから別のDBへの構成の違いが原因で、フォーマットが同じでないことに関連しています。テスト環境は本番サイトのレプリカである必要があることはわかっていますが、適切に設定することは私の手にはありません。また、データベースの設定方法に関係なく、Timestamp-as-a-formatted-stringフィールドを送信する必要があります。何か案は?前もって感謝します。

****編集****:特定の構成にもかかわらず正しく機能させる方法を見つけました。これは、適切なOracle命令を使用してWebサービスで呼び出し命令を設定するのと同じくらい簡単です。つまり、Oracleストアドプロシージャの呼び出しは

"call PACKAGE.MYPROCEDURE(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"

"call PACKAGE.MYPROCEDURE(?,?,?,?,?,?,TO_TIMESTAMP(?, 'DD-MM-YYYY HH24:MI:SS'),?,?,?,?,?,?,?,?,?,?,?)"

プロシージャの呼び出しで設定した形式は、元の質問に記載されているSimpleDateFormatを使用してWebアプリから送信された形式と一致しますが、わずかに変更されています。

SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");

助けとアイデアをありがとうございました。

4

2 に答える 2

1

デフォルトのNLS_DATE_FORMATには通常、時刻は含まれず、2桁の年のみが含まれます。おそらくDD-MM-YYまたはMM-DD-YYのいずれかです。

WSが文字列を受信し、データベースストアドプロシージャにタイムスタンプが必要な場合、2つはフォーマットマスクをネゴシエートする必要があります。WSがデータベースに接続するときに、明示的な日付形式を設定するか、データベースが文字列を受け入れてハードコードされた形式を使用して変換できる必要があります。

WSで定義した特定のネゴシエーションがない限り、JavaWebAppまたはWebServiceClientは、データベースがWSが使用していると想定する形式に影響を与えることはできません。

そうは言っても、私はあなたの最後にある他のコードを調べて、同様の翻訳を行っているものがあるかどうかを確認します。特定の形式を使用して他の何かを見つけることができます。

于 2010-03-25T05:40:35.503 に答える
0

inputプリペアドステートメントでのクエリはどのようになりますか?このエラーは、渡された日付形式がOracleに合わないことを示しています。テスト環境では、使用されているデータベースまたはマシン/ドライバーに異なるNLS_DATE_FORMATが設定されている可能性があります。

于 2010-03-24T23:51:48.453 に答える