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_INTEGER
和BINARY_INTEGER
是相同的。为简单起见,本文档使用 PLS_INTEGER 表示PLS_INTEGER
和BINARY_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_integer
和 pls_integer
都是一样的。两者都是 PL/SQL 数据类型,范围为 -2,147,648,467 到 2,147,648,467。
与integer
和binary_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 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章