【问题标题】:Difference between PLS_INTEGER and INTEGER for below scenario以下场景的 PLS_INTEGER 和 INTEGER 之间的区别
【发布时间】:2015-10-01 08:48:31
【问题描述】:

请看这两种情况:

案例 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 执行成功?

【问题讨论】:

    标签: oracle plsql casting oracle11g type-conversion


    【解决方案1】:

    PLS_INTEGER and BINARY_INTEGER Data Types 的文档 只说:

    具有溢出 PLS_INTEGER 范围的两个 PLS_INTEGER 值的计算会引发溢出异常,即使您将结果分配给 NUMBER 数据类型也是如此。

    但它并没有告诉你为什么。我认为原因是 PLS_INTEGER 操作使用硬件算术,所以 Oracle 在内部正确地这样做

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

    【讨论】:

      【解决方案2】:

      PLS_INTEGER 最多可以存储 2,147,483,647。越过这个,会导致溢出异常。

      INTEGER 是 NUMBER 数据类型的预定义子类型,通常称为 NUMBER(38)。这意味着,它可以达到 (10^39) - 1。所以,你的第一个代码块也不例外。

      【讨论】:

        【解决方案3】:

        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 的正负固定数

        【讨论】:

          猜你喜欢
          • 2013-10-13
          • 1970-01-01
          • 1970-01-01
          • 2011-11-16
          • 2014-05-30
          • 1970-01-01
          • 2019-02-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多