首页 > 解决方案 > 获得较小数字的数字溢出错误,但获得较大数字的成功

问题描述

以下是我的测试功能:

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;

我没有收到错误。

有人可以解释这种行为,因为第二个查询是一个更大的数字吗?

标签: oracleplsql

解决方案


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

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

pls_integer出于性能原因,小整数文字被视为相同。不幸的是,这种类型在溢出时引发异常:

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

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

这是 AskTom 上的类似问题:Datatype Number results in Numeric overflow 尽管值足够小


推荐阅读