oracle的兩個bug

sunwgneuqsoft發表於2007-12-08

前一陣子在網上查資料,看到了一個關於oracle日期型別的小bug

SQL> select * from v$version;

BANNER

----------------------------------------------------------------

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

PL/SQL Release 10.2.0.1.0 - Production

CORE10.2.0.1.0 Production

TNS for 32-bit Windows: Version 10.2.0.1.0 - Production

NLSRTL Version 10.2.0.1.0 – Production

[@more@]

SQL> select 1 from dual where to_char(sysdate - 733021,'yyyy-mm-dd bc')=to_char(sysdate - 733022,'yyyy-mm-dd bc');

1

----------------------

1

也就是說sysdate – 733021sysdate – 733022是相等的。我們都知道的,日期減一的話就是減少一天,而上面的例子中兩者卻是相等的。

SQL> select to_char(sysdate - 733021,'yyyy-mm-dd bc') from dual;

TO_CHAR(SYSDATE-733021,'YYYY-M

------------------------------

0000-00-00 00

SQL> select to_char(sysdate - 733022,'yyyy-mm-dd bc') from dual;

TO_CHAR(SYSDATE-733022,'YYYY-M

------------------------------

0000-00-00 00

問題就是出在了這個0000年上了。實際上是不存在0000年的,公元前一年接下來就是公元一年了。而oracle資料庫中卻引入了0000年。不大清楚為什麼oracle要引入0000年。

在我的這個版本的資料庫,上面的SQL不會有問題,而在一些其他的版本,上面的查詢是會報錯誤的,錯誤的 大概就是年度不能為0 ,錯誤號記不不清楚了。

這只是一個小問題,一般說來沒什麼影響。

有個同事發現的9i中的分割槽表的bug就十分弱智了,如果一個對不規則分割槽的訪問透過迴圈中的繫結變數的SQL執行,那麼在那些不規則的分割槽上將不會得到正確的結果。正確的SQL居然得到的錯誤的結果。還好,這個關於分割槽表的bug10g中已經糾正了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8394333/viewspace-989979/,如需轉載,請註明出處,否則將追究法律責任。

相關文章