微軟ODBC driver for oracle的問題

我知道微軟之前已宣告不再為Oracle資料庫寫driver了, 而且微軟的ODBC driver for oracle最近的版本, 也是2008年了, 距今也有4年多, 可算是很舊的。


不過, 十幾年前我開始使用微軟的ODBC driver for oracle時, 用得還很順手。和PowerBuilder配合起來也沒什麼問題, 可能我用的功能很少很單純! 後來, 碰到一些問題, 同事告訴我有一些SQL語句, 這個driver沒有辦法解析, 他的解決方法是把這個driver換掉, 換成Oracle自家寫的ODBC driver, 問題就解決了!

最近我也碰到同樣的情況:
select xxx
from p, e, d, s, ed, dp, (
select a, sum(hours) h
from (
select a, 0 hours
from p
wherer y = :year
union all
select a, hours
from pof
where b between :d1 and :d2 ) group by a
) v
where p.a = e.c
and d.a = s.s
...
and p.a = v.a
這個SQL語句, 使用微軟的ODBC driver時, 會傳回錯誤訊息ORA-01861:文字與格式字串不符, 但是把ODBC driver換成Oracle自家寫的那支, 卻會很正常的跑完, 並傳回正確的結果。那就換driver不就好了, 還有什麼好討論的呢? 問題就在於, 有些奇奇怪怪的情況下, 一定要用微軟的那支driver, 這個時候就很頭大了。
我試了一下, 發現這個SQL語句的問題在於:
1. 可能是太多層的子查詢,
2. 或者是union
3. 反正太複雜了會造成微軟那支driver出問題。

所以, 我把SQL語句改寫:
select xxx
from p, e, d. s. ed, dp, (
select a, sum(hours) h
from pof
where b between :d1 and :d2
group by a
) v
where p.a = e.c
and d.a = s.s
...
and p.a = v.a (+)
這樣就ok了, 可以成功正常的跑出正確結果!

留言

這個網誌中的熱門文章

D-BUS學習筆記

關於藍牙裝置找尋(inquiry, scan)兩三事

Cisco Switch學習筆記: EtherChannel