[PLSQL]ORA-01426: numeric overflow ?? !!

 

遇到一个有点意思的问题,在执行如下一段code的时候,出现了 numeric overflow的错误.....

frank @ORCL >  l
  
1    declare
  
2   v_test_number  number ;
  
3    begin
  
4   v_test_number : =   1000 * 60 * 60 * 24 * 365 ;
  
5 *   end ;
frank
@ORCL >   /
declare
*
ERROR at line 
1 :
ORA
- 01426 : numeric overflow
ORA
- 06512 : at line  4

 

 

 

从给出的错误提示来看,貌似是1000*60*60*24*365超出了number类型所能容纳的范围了,但是...

 

frank @ORCL >   select   1000 * 60 * 60 * 24 * 365 , length(to_char( 1000 * 60 * 60 * 24 * 365 ))  from  dual;

1000 * 60 * 60 * 24 * 365  LENGTH(TO_CHAR( 1000 * 60 * 60 * 24 * 365 ))
-- --------------- ----------------------------------
        3 .1536E + 10                                   11

 

 

可以看到1000*60*60*24*365的值的长度为才是11,而NUMBER可以支持到整数位长度为38的数字,因此这个值远远没有到numeric overflow的情况。但是为啥Oracle会报出这么一个错误呢? 真的很费解.......

 

搜了下对这个ORA-error的解释,如下所示......

 

Error:

ORA-01426: numeric overflow

Cause:

You tried to evaluate an expression that resulted in a numeric overflow (or underflow).

Action:

The options to resolve this Oracle error are:
  1. Re-write your expression using fewer operands.
  2. Make sure that your expression does not evaluate to infinity.

 

 

看到Action部分有说到要减少operand的个数,难道是1000*60*60*24*365 这5个数在一起连乘都不行吗? 测试下分成两步来做,情况如何.....

 

--  不死心,再试一次,还是出错........
frank @ORCL >  variable v_test  number
frank
@ORCL >   exec  :v_test : =   1000 * 60 * 60 * 24 * 365 ;
BEGIN  :v_test : =   1000 * 60 * 60 * 24 * 365 END ;

*
ERROR at line 
1 :
ORA
- 01426 : numeric overflow
ORA
- 06512 : at line  1


--  好吧,再声明一个变量,分两步走..... 
frank @ORCL >  variable v_test2  number ;
frank
@ORCL >   exec  :v_test : =   1000 * 60 * 60 * 24 ;

PL
/ SQL  procedure  successfully completed.
frank
@ORCL >   exec  :v_test2 : =  :v_test  *   365 ;

PL
/ SQL  procedure  successfully completed.

 

 

可以看到,这样做就OK了.....真是诡异啊...........

 

以后再碰到这样的问题,得多“长个心眼”了 ~~ 

 

 

还不清楚导致这个问题的根本原因是啥, 先记录在此,以作前车之鉴......

 

 

 

 

 

转载于:https://www.cnblogs.com/fangwenyu/archive/2010/06/11/1756643.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值