【问题标题】:What's the difference between pls_integer and binary_integer?pls_integer 和 binary_integer 有什么区别?
【发布时间】:2011-11-16 18:48:56
【问题描述】:

我继承了一些代码,这些代码将成为一些额外工作的基础。查看存储的过程,我看到了很多关联数组。

其中一些由 binary_integers 索引,一些由 pls_integers 索引。两者有什么区别吗?

我看过the documentation,但除了这一行:

PL/SQL 数据类型PLS_INTEGERBINARY_INTEGER 是相同的。为简单起见,本文档使用 PLS_INTEGER 表示 PLS_INTEGERBINARY_INTEGER

我找不到两者之间的任何区别。那么有什么区别呢?出于历史/兼容性原因,两者都存在吗?

我正在使用 Oracle 10gR2

【问题讨论】:

    标签: oracle plsql oracle10g associative-array


    【解决方案1】:

    历史原因。他们used to be different before 10g

    在 8i 和 9i 上,PLS_INTEGER 明显快于 BINARY_INTEGER。


    在声明和操作整数方面,Oracle 提供了许多选项,包括:

    INTEGER - 在 STANDARD 包中定义为 NUMBER 的子类型,此数据类型以完全独立于平台的方式实现,这意味着您对 NUMBER 或 INTEGER 变量所做的任何事情都应该以相同的方式工作,而不管在哪个硬件上数据库已安装。

    BINARY_INTEGER - 在 STANDARD 包中定义为 INTEGER 的子类型。声明为 BINARY_INTEGER 的变量可以在 -231+1 .. 231-1 之间赋值,也就是 -2,147,483,647 到 2,147,483,647。在 Oracle9i 数据库第 2 版之前,BINARY_INTEGER 是唯一允许关联数组(也称为索引表)的索引数据类型,如下所示:

      TYPE my_array_t IS TABLE OF VARCHAR2(100) 
      INDEX BY BINARY_INTEGER
    

    PLS_INTEGER - 在 STANDARD 包中定义为 BINARY_INTEGER 的子类型。声明为 PLS_INTEGER 的变量可以在 -231+1 .. 231-1 之间分配值,也就是 -2,147,483,647 到 2,147,483,647。 PLS_INTEGER 操作使用机器算术,因此它们通常比 NUMBER 和 INTEGER 操作快。此外,在 Oracle 数据库 10g 之前,它们比 BINARY_INTEGER 更快。但是,在 Oracle 数据库 10g 中,BINARY_INTEGER 和 PLS_INTEGER 现在是相同的并且可以互换使用。

    【讨论】:

    【解决方案2】:

    binary_integerpls_integer 都是一样的。两者都是 PL/SQL 数据类型,范围为 -2,147,648,467 到 2,147,648,467。

    integerbinary_integer pls_integer 相比,执行速度非常快。因为pls_intger 操作机器算术,binary_integer 操作库算术。

    pls_integer 来自 oracle10g。

    binary_integer 允许在 oracle9i 之前为关联数组索引整数。

    清晰的例子:

    SET TIMING ON
    
    declare
      num   integer := 0;
      incr  integer := 1;
      limit integer := 100000000;
    begin
      while num < limit loop
        num := num + incr;
      end loop;
    end;
    PL/SQL procedure successfully completed.
    
    Elapsed: 00:00:20.23
    ex:2
    declare
      num   binary_integer := 0;
      incr  binary_integer := 1;
      limit binary_integer := 100000000;
    begin
      while num < limit loop
        num := num + incr;
      end loop;
    end;
    / 
    
    PL/SQL procedure successfully completed.
    
    Elapsed: 00:00:05.81
    ex:3
    declare
      num   pls_integer := 0;
      incr  pls_integer := 1;
      limit pls_integer := 100000000;
    begin
      while num < limit loop
        num := num + incr;
      end loop;
    end;
    / 
    

    【讨论】:

    • 范围实际上是 -2,147,483,647 到 2,147,483,647。
    【解决方案3】:

    pls_integer 和 binary_integer 之间的另一个区别是,当涉及 pls_integer 的计算溢出时,PL/SQL 引擎将引发运行时异常。但是,涉及 binary_integer 的计算即使发生溢出也不会引发异常。

    【讨论】:

    • 自 oracle 11.2g 以来不正确。请参见引发 ORA-01426 错误的示例:declare limit binary_integer := 2147483647; begin limit := limit + 1; end; /
    猜你喜欢
    • 2015-10-01
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    • 2011-11-22
    • 2015-03-26
    相关资源
    最近更新 更多