以下场景中PLS_INTEGER和INTEGER之间的差异

时间:2015-07-13 07:16:46

标签: 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;

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

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

3 个答案:

答案 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.因此,第一个代码块也不例外。