yangtingkun
===========================================================
10g PLSQL数值类型的溢出
===========================================================

由于版本升级导致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类型就可以了。

yangtingkun 发表于:2010.02.02 17:19 ::分类: ( ORACLE ) ::阅读:(663次) :: 评论 (0)

发表评论
标题

在此添加评论
表情符号: smile laughing tongue angry crying sad wassat wink

称呼

邮箱地址(可选)

个人主页(可选)

 authimage


切换风格
新闻聚合
博客日历
文章归档...
最新发表...
最新评论...
最多阅读文章...
最多评论文章...
博客统计...
Blog信息
网站链接...