我在查詢兩個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 - 生產
你應該改變你的查詢。查詢中由布爾邏輯短路的類型不匹配看起來非常危險。對於生產系統更是如此。 –
「NULL實際上是一個參數」。所以查詢就像'WHERE(:dt是null或SYSDATE> = TRUNC(:dt))'?那麼顯然你正在向該綁定變量傳遞一個數字類型。通過日期類型,你應該沒問題。 –