以下是我的测试功能:
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;
Run Code Online (Sandbox Code Playgroud)
当我执行函数时
select test() from dual;
Run Code Online (Sandbox Code Playgroud)
我收到一个错误
1426. 00000 - "numeric overflow"
*Cause: Evaluation of an value expression causes an overflow/underflow.
Run Code Online (Sandbox Code Playgroud)
但是,如果我更新
v_msisdn:=50510060853 * 10000;
Run Code Online (Sandbox Code Playgroud)
我没有得到错误.
有人可以解释这个行为,因为第二个查询是一个更大的数字?
def*_*ale 12
您可以通过将一个整数文字转换为integer或来解决此问题number:
v_msisdn:= cast(225952 as integer) * 10000;
Run Code Online (Sandbox Code Playgroud)
pls_integer出于性能原因,会对小整数文字进行处理.不幸的是,这种类型会在溢出时引发异常:
即使将结果分配给NUMBER数据类型,使用溢出PLS_INTEGER范围的两个PLS_INTEGER值的计算也会引发溢出异常.对于PLS_INTEGER范围之外的计算,请使用INTEGER,即NUMBER数据类型的预定义子类型.
在第二个示例中,其中一个值(50510060853)不适合范围pls_integer,因此被解释为integer.
这是关于AskTom的类似问题:虽然数值足够小,但数据类型编号导致数字溢出