2015-11-06 57 views
2

我在查詢兩個Oracle數據庫時遇到了麻煩。Oracle評估條件不正確

查詢是:

SELECT trunc(null) 
FROM dual 
WHERE (null is null 
     or SYSDATE >= TRUNC(null)) 

(該NULL實際上是一個PARAM,傳遞到查詢時,它可以爲null,所以我切查詢短)。

在生產數據庫上,它工作正常,響應爲空。

在開發數據庫上我發現一個錯誤,即TRUNC不能應用於NUMBER並且期望DATE(ORA-00932)。

很顯然,生產DB跳過OR之後的條件中的所有內容,而開發人員在OR之後執行該部分。

我知道一個解決方案,通過爲每個查詢添加CAST(MY_PARAM as date)來解決問題,但它並不真正適合我 - 需要更改很多代碼。

問題是:在數據庫中是否存在一些設置,我錯過了,它在條件掃描已經爲真或者依賴於數據庫版本後是否阻止掃描?

我的生產DB是:

  • Oracle數據庫11g企業版發佈11.2.0.4.0 - 64位生產
  • PL/SQL發佈11.2.0.4.0 - 生產
  • CORE 11.2.0.4 0.0生產
  • TNS對64位Windows:版本11.2.0.4.0 - 生產
  • NLSRTL版11.2.0.4.0 - 生產

我的dev的分貝是:

  • Oracle數據庫11g企業版發佈11.2.0.1.0 - 64位生產
  • PL/SQL發佈11.2.0.1.0 - 生產
  • CORE 11.2.0.1。 0生產
  • TNS對64位Windows:版本11.2.0.1.0 - 生產
  • NLSRTL版11.2.0.1.0 - 生產
+1

你應該改變你的查詢。查詢中由布爾邏輯短路的類型不匹配看起來非常危險。對於生產系統更是如此。 –

+0

「NULL實際上是一個參數」。所以查詢就像'WHERE(:dt是null或SYSDATE> = TRUNC(:dt))'?那麼顯然你正在向該綁定變量傳遞一個數字類型。通過日期類型,你應該沒問題。 –

回答

0
SELECT CASE (PARAM IS NULL) THEN NULL ELSE TRUNC(PARAM) END 
FROM TABLE 
+0

我無法改變我的查詢,它們很長,就像50條線,每條都有很多條件,並且有它們的廢話。問題是oracl如何在條件內進行掃描。 – Ermintar

+0

你無法知道。 Oracle可以自由選擇WHERE子句中檢查條件的順序。 –

+0

在WHERE子句中使用CASE: –