1

Spring 'CallableStatementCreator' を使用して、Java EE Web アプリケーション (Java) で Oracle ストアド プロシージャを呼び出そうとしています。ストアド プロシージャの入力の 1 つは DATE です。

私のattributeValueはjava.util.dateで、DD-MM-YYYYとHH:MM:SSの両方を正しく保持しています。次のコードを使用する場合:

callableStmt.setTime(6, new java.sql.Time(attributeValue.getTime()));

その結果、DB の列 (ストアド プロシージャが最終的に DB に書き込む) が 1970-01-01 に設定され、正しい HH:MM:SS が入力として渡されます。これは、アプリケーションの以前のバージョン (JDBC lib 10.xxx を使用したバージョン) で機能しました。

私が使用する場合

callableStmt.setDate(6, new java.sql.Date(attributeValue.getTime()));

DD-MM-YYYY は正しく設定されていますが、時間は 00:00:00 に設定されています。

では、属性を呼び出してこのストアド プロシージャに渡す正しい方法は何でしょうか? また、デバッグのヒントはありますか?

Oracle Database 11g Enterprise Edition リリース 11.2.0.2.0 - 64 ビット プロダクション Oracle JDBD lib: ojdbc6-11.2.0.3

4

2 に答える 2

4

を使用してみてくださいTimestamp:

callableStmt.setTimestamp(6, new java.sql.Timestamp(attributeValue.getTime()));
于 2013-02-20T21:10:33.720 に答える
0

使用する

callableStmt.setTimestamp(6, new java.sql.Timestamp(attributeValue.getTime()));

私の 3 つの関数の唯一の違いは、VARCHAR2、DATE、または NUMBER の最後のパラメーターである、オーバーロードされたストアド プロシージャがある私のケースでは機能しませんでした。このコードを使用すると、Oracle が使用するメソッドを見つけられないため、ストアド プロシージャの実行が失敗します。(おそらく、ここで説明されているように、JDBC lib がタイムスタンプを DATE 列にマップしていないため)

それが機能する唯一の方法は次のとおりでした:

callableStmt.setObject(6, new java.sql.Timestamp(attributeValue.getTime()), OracleTypes.DATE);

DD-MM-YYYYとHH:MM:SSを維持しながら、OracleストアドプロシージャのタイムスタンプからDATE列へのマッピングを強制しているようです。

于 2013-02-21T00:05:47.620 に答える