0

次のクエリを使用していくつかのデータをフェッチしています

SELECT    
t.value_date,t.settlement_date,    
  (CASE WHEN NVL( t.settlement_date, '01-01-9999')='01-01-9999'
    THEN t.value_date
    ELSE t.settlement_date
  END) AS modified_value_date,    
  t.instrument_pk,    
  bct.base_ccy_pk,    
  i.contract_size,    
  lc.min_trading_unit AS min_trading_unit_lc,    
  bc.min_trading_unit AS min_trading_unit_bc    

FROM transaction t,    
  bc_transaction bct,    
  instrument i,    
  instrument lc,    
  instrument bc

WHERE t.status         = 'NORMAL'    
AND t.fund_pk          = 99436    
AND t.instrument_pk    = 235342    
AND t.instrument_pk    = i.instrument_pk    
AND t.local_ccy_pk     = lc.instrument_pk    
AND bct.transaction_pk = t.transaction_pk    
AND bct.base_ccy_pk    = bc.instrument_pk    
AND t.value_date      >= to_date('20121123000000','yyyymmddhh24miss')    
AND t.transaction_type = 'SECURITY_TRADE'    
ORDER BY modified_value_date,    
  t.processing_order,    
  t.txn_reference_no;

問題は、Oracle SQL Developerで上記のクエリを実行すると、適切な結果が得られることです。しかし、PreparedStatementを使用してJavaプログラムからクエリを実行しようとすると、java.sql.SQLExceptionのような例外が生成されます。ORA-01843:有効な月ではありません

CASEbolckの日付を次のように置き換えると問題が解決しました

(CASE WHEN NVL(t.settlement_date,to_date('99990101000000','yyyymmddhh24miss'))=to_date('99990101000000','yyyymmddhh24miss') 
    THEN t.value_date 
    ELSE t.settlement_date 
  END) AS modified_value_date

今私の質問は

  1. なぜそのような種類の不一致があるのですか?問題がto_date()にある場合は、SQL開発者でも同じ例外が発生するはずです。
  2. 問題はここで終了しません。日食からプログラムをデバッグしているときに、NVLブロックでto_date()なしで同じクエリが完全に実行されていることを確認しました。チェックしたところ、JDKは1.5でしたが、JREは1.6でした。 JREを1.5に変更し、同じJavaプログラムをデバッグしたところ、デバッグ時に、NVLブロックにto_date()がない同じクエリに対して同じ例外が発生していることがわかりました。

    今、私は完全に混乱しています。なぜJRE5とJRE6の間にこのような不一致があるのでしょうか。

誰かが私を助けることができますか?

4

1 に答える 1

2

JREバージョンではなく、セッション設定に関するものです。文字列を指定し、NLS 設定 (おそらく NLS_DATE_FORMAT) を使用して暗黙的に日付に変換するように Oracle セッションを終了しました。
外部設定に依存するようにハードコードされた値を残さないでください。
代わりに使用できますDATE'9999-01-01'

于 2013-02-13T06:18:24.380 に答える