Oracle PLS_整数和以下情况下整数之间的差异

Oracle PLS_整数和以下情况下整数之间的差异,oracle,plsql,casting,oracle11g,type-conversion,Oracle,Plsql,Casting,Oracle11g,Type Conversion,请参见以下两个场景: 案例1: DECLARE p1 PLS_INTEGER := 2147483647; p2 INTEGER := 1; n NUMBER; BEGIN n := p1 + p2; END; PL/SQL procedure successfully completed. 案例2 DECLARE p1 PLS_INTEGER := 2147483647; p2 PLS_INTEGER := 1; n NUMBER; BEGIN n := p1 + p2; END; Er

请参见以下两个场景:

案例1:

DECLARE
p1 PLS_INTEGER := 2147483647;
p2 INTEGER := 1;
n NUMBER;
BEGIN
n := p1 + p2;
END;

PL/SQL procedure successfully completed.
案例2

DECLARE
p1 PLS_INTEGER := 2147483647;
p2 PLS_INTEGER := 1;
n NUMBER;
BEGIN
n := p1 + p2;
END;

Error at line 1
ORA-01426: numeric overflow
ORA-06512: at line 6

为什么
案例2
失败,即使我尝试添加相同的数据类型,而
案例1
成功执行?

PLS\u INTEGER是PL/SQL数据类型,根据:

存储范围为-2147483648到2147483647的带符号整数

另一方面,INTEGER是一种ANSI SQL数据类型,Oracle将其转换为零刻度的数字

根据,NUMBER是一种Oracle内置的数据类型

存储绝对值在1.0 x 10^-130到但不包括1.0 x 10^-126之间的零、正数和负数


PLS_整数最多可存储2147483647。如果越过此点,将导致溢出异常

整数是数字数据类型的预定义子类型,通常称为数字(38)。也就是说,它可以达到(10^39)-1。因此,您的第一个代码块也不例外。

的文档 只说:

两个PLS_整数值溢出PLS_整数值范围的计算会引发溢出异常,即使将结果指定给数字数据类型也是如此

但它并没有告诉你为什么。我想原因是PLS_整数运算使用硬件算法,所以Oracle内部也会这样做

n := CAST(p1 + p2 AS NUMBER);