pls_integer 和 binary_integer 有啥区别?

Posted

技术标签:

【中文标题】pls_integer 和 binary_integer 有啥区别?【英文标题】: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

【问题讨论】:

【参考方案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 现在是相同的并且可以互换使用。

【讨论】:

这里是 9i 文档,其中提到了不同之处,但没有详细说明:download.oracle.com/docs/cd/B10500_01/appdev.920/a96624/… 无论如何,它现在已经过时了。 但是请看下面的链接:oracle.com/technetwork/database/features/plsql/documentation/… Binary_Integer 实现是基于类似 Hash 的数据结构,所以搜索和 PLS_INTEGER 排序应该更快,因为它们是在 B*-Trees 上实现的【参考方案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; /

以上是关于pls_integer 和 binary_integer 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

PLSQL开发笔记和小结

oracle集合

plsql语法架构

Oracle总结三

Oracle总结三

oracle jobs查看 sql及创建 jobs