plsql ORA-01426中的数字溢出

时间:2017-11-30 08:23:43

标签: sql oracle numbers

我必须计算这个

select power((1+(100000/365)),365)-1 from dual

但无论我改变了什么,总会得到数字溢出。 我尝试使用pls_integer, cast,来舍入结果。 请帮帮我

2 个答案:

答案 0 :(得分:0)

公式是根据每日复合率计算利息。 (我假设这是兴趣 - 它可能同样是人口增长或其他东西)。

因此统一费率为100,000,相当于10,000,000%。将其除以365得到每日费率(约27,000%),然后幂函数会导致复合利息被应用。

但是你的初始利率是如此巨大,以至于任何复合增长都必然会在短时间内爆炸;每天27,000%是很多。

在这种情况下,答案是大约10 ^ 890,如果我的计算器正确地为我服务。

因此,简而言之,您的公式是正确的。你的参数错了。

答案 1 :(得分:0)

舍入返回的值将无济于事,因为在将值返回给您之前(在幂函数内部)会发生错误。因此,除非您减少操作数,否则您将无法摆脱它。

power(((1+(100000/365)),365)达到无穷大。幂函数中使用的变量不能处理这个更大的值。

以下版本显示了它如何达到无穷大。作为脚本运行。

SET SERVEROUTPUT ON
WITH FUNCTION to_power(A VARCHAR2,b VARCHAR2) RETURN varchar2 IS
pow VARCHAR2(32767):=1;
BEGIN
   dbms_output.put_line('START..');
   -----------------------------------------------------------
 FOR I IN 1 .. ABS(b)
   LOOP
      dbms_output.put_line('IN ABS LOOP '||I);
     pow:=A*pow;
     IF pow='~' THEN
       dbms_output.put_line('REACHED INFINITE..');
       EXIT;
     END IF;   
   END LOOP; 
-----------------------------------------------------------  
IF b < 0 THEN
 dbms_output.put_line('FOUND NEGATIVE');
 IF pow='~' THEN
    dbms_output.put_line('WILL NOT DEVIDE 1 BY INFINITE, HENCE RETURNING 0');
    RETURN 0;
 END IF;       
  BEGIN
    dbms_output.put_line('BEFORE DEVIDE');
    RETURN 1/pow;
  EXCEPTION
     WHEN OTHERS THEN
        dbms_output.put_line('ERROR OCCURED IN NEGATIVE DEVIDE');
        RETURN 0;           
  END;  
  dbms_output.put_line('END OF NEGATIVE PROCESSING');     
ELSE
   dbms_output.put_line('RETURNING + VALUE');
  RETURN pow;
END IF;
---------------------------------------------------------- 
END;
-------------------------------------

SELECT to_power(274,365) FROM dual