以下是我的测试功能:
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;
我没有收到错误消息。
由于第二个查询的数字更大,有人可以解释一下此行为吗?
答案 0 :(得分:12)
您可以通过将整数文字之一转换为integer
或number
来解决此问题:
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