请参阅以下两种情况:
案例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
为什么case 2
失败,即使我尝试添加相同的数据类型而case 1
成功执行?
答案 0 :(得分:1)
PLS_INTEGER and BINARY_INTEGER Data Types的文档 只说:
使用溢出PLS_INTEGER范围的两个PLS_INTEGER值的计算会引发溢出异常,即使您将结果分配给NUMBER数据类型也是如此。
但它没有告诉你原因。我假设原因是PLS_INTEGER操作使用硬件算法,所以Oracle在内部正确地做了它
n := CAST(p1 + p2 AS NUMBER);
答案 1 :(得分:0)
PLS_INTEGER是PL / SQL数据类型,根据the PL/SQL Language Reference:
存储-2,147,483,648到2,147,483,647
范围内的有符号整数
另一方面,INTEGER是ANSI SQL数据类型,Oracle将其转换为零比例的NUMBER。
根据Database SQL Language Reference,NUMBER是Oracle内置数据类型
存储零以及正负固定数字,绝对值为1.0 x 10 ^ -130但不包括1.0 x 10 ^ 126
答案 2 :(得分:0)
PLS_INTEGER最多可存储2,147,483,647。越过这一点,将导致溢出异常。
INTEGER是NUMBER数据类型的预定义子类型,通常称为NUMBER(38)。这意味着,它可以达到(10 ^ 39) - 1.因此,第一个代码块也不例外。