对于较小的数字,获取数字溢出错误,但对于较大的数字,则成功

时间:2018-09-05 14:08:55

标签: oracle plsql

以下是我的测试功能:

create or replace FUNCTION test
RETURN NUMBER
AS
  v_count   number(15);
  v_msisdn  number(15);
BEGIN
  v_msisdn:= 225952 * 10000;
  -- v_msisdn:=50510060853 * 10000;

  return v_msisdn;
END;

当我执行功能时

select test() from dual;

我遇到错误

1426. 00000 -  "numeric overflow"
*Cause:    Evaluation of an value expression causes an overflow/underflow.

但是,如果我更新

v_msisdn:=50510060853 * 10000;

我没有收到错误消息。

由于第二个查询的数字更大,有人可以解释一下此行为吗?

1 个答案:

答案 0 :(得分:12)

您可以通过将整数文字之一转换为integernumber来解决此问题:

v_msisdn:= cast(225952 as integer) * 10000;

出于性能方面的考虑,小整数常量被视为pls_integer。不幸的是,这种类型在溢出时引发异常:

  

即使将结果分配给NUMBER数据类型,具有两个PLS_INTEGER值都会溢出PLS_INTEGER范围的计算会引发溢出异常。对于PLS_INTEGER范围之外的计算,请使用INTEGER(NUMBER数据类型的预定义子类型)。 / p>

在第二个示例中,值(50510060853)之一不适合pls_integer的范围,因此被解释为integer

这是AskTom上的类似问题:Datatype Number results in Numeric overflow although value is small enough