发表于: 2010.02.02 17:19
分类: ORACLE
出处: http://yangtingkun.itpub.net/post/468/496530
---------------------------------------------------------------
由于版本升级导致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类型就可以了。











