ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 10g PLSQL数值类型的溢出

10g PLSQL数值类型的溢出

原创 Linux操作系统 作者:yangtingkun 时间:2010-02-02 17:19:17 0 删除 编辑

由于版本升级导致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博客 ” ,链接:https://blog.itpub.net/4227/viewspace-626670/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1964
  • 访问量
    11077909