Oracle PLS_整数和以下情况下整数之间的差异
请参见以下两个场景: 案例1: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
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);