10g PLSQL數值型別的溢位

yangtingkun發表於2010-02-02

由於版本升級導致PL/SQL中數值溢位的問題。

 

 

資料庫升級過程往往會帶來很多未知的因素,比如從10g開始,PL/SQL中隱含利用INTEGER型別代替NUMBER型別進行整數的運算,以便獲得更好的效能。但是這就可能使得9i中執行正常的PL/SQL過程出現數值溢位的錯誤。

看一個最簡單的問題:

SQL> declare
  2  v_num number;
  3  begin
  4  v_num := 65536*65536;
  5  end;
  6  /

PL/SQL 過程已成功完成。

SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit Production
PL/SQL Release 9.2.0.4.0 - Production
CORE    9.2.0.3.0       Production
TNS for Linux: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production

9i中正常執行的PL/SQL過程,在10g中就會報錯:

SQL> declare
  2  v_num number;
  3  begin
  4  v_num := 65536*65536;
  5  end;
  6  /
declare
*
1 行出現錯誤:
ORA-01426:
數字溢位
ORA-06512:
line 4


SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi
PL/SQL Release 10.2.0.3.0 - Production
CORE    10.2.0.3.0      Production
TNS for Solaris: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production

錯誤原因其實上面已經提到了,要解決這個錯誤也很簡單:

SQL> declare
  2  v_num number;
  3  begin
  4  v_num := 65536*65536.0;
  5  end;
  6  /

PL/SQL 過程已成功完成。

SQL> declare
  2  v_num number(38, 1);
  3  begin
  4  v_num := 65536*65536.0;
  5  end;
  6  /

PL/SQL 過程已成功完成。

只要避免Oracle自動利用INTEGER來代替NUMBER型別就可以了。

 

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

相關文章