【问题标题】:Sql Query running in oracle SQL Developer But when i run the query from my JAVA program it is giving Sql exceptionSql Query 在 oracle SQL Developer 中运行但是当我从我的 JAVA 程序运行查询时,它给出了 Sql 异常
【发布时间】:2013-02-13 06:04:56
【问题描述】:

我正在使用以下查询获取一些数据

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: not a valid month

当我用

替换 CASE bolck 中的日期时,我的问题得到了解决
(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. 问题并没有在这里结束当我再次从 Eclipse 调试我的程序时,我看到相同的查询正在完美运行 在 NVL 块中没有 to_date() 我检查并发现我的 JDK 是 1.5 但 JRE 是 1.6。然后我将 JRE 更改为 1.5 并调试 相同的java程序,发现它产生相同的 例外,对于在 NVL 块中没有 to_date() 的相同查询,在 调试时间。

    现在我完全搞砸了为什么会有这样的差异 JRE 5 和 JRE 6?

谁能帮帮我?

【问题讨论】:

  • 你能贴出你的java代码吗?
  • 这整个CASE WHEN NVL(... 没有意义,为什么不只是NVL( t.settlement_date, t.value_date) 呢?或CASE WHEN t.settlement_date is null then ...
  • A.B.Cade 你是对的。NVL 时不需要使用 CASE(...。但我担心的是其他问题。如果我使用上面的 sql,它在 SQL DEVELOPER 中运行良好。但是从我的代码中,它产生异常 java.sql.SQLException: ORA-01843: not a valid month.if 我的 sql 不正确,它也应该在 sql developer 中给出相同的异常......
  • @AngshumanDey,因为你已经得到了一个答案 - 当你使用带有日期的 NVL 和字符串时,oracle 会根据NLS_DATE_FORMAT 将你的字符串隐式转换为日期,这在打开的不同会话中可能会有所不同通过不同的工具,始终使用to_date 函数显式转换您的字符串日期。 stackoverflow.com/a/14847616/1083652

标签: java sql oracle


【解决方案1】:

这与 JRE 版本无关,而是与您的会话设置有关。您已指定字符串并离开 Oracle 会话以使用 NLS 设置(可能是 NLS_DATE_FORMAT)隐式转换为日期。
帮自己一个忙——永远不要让硬编码值依赖于外部设置。
你可以改用DATE'9999-01-01'。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2016-01-27
    • 2013-05-11
    • 1970-01-01
    相关资源
    最近更新 更多