"pls_integer"和"binary_integer"之间有什么区别?

34

我继承了一些代码,将作为额外工作的基础。查看存储过程时,我发现有相当多的关联数组。

其中一些是由binary_integers索引的,另一些是由pls_integers索引的。这两者之间有什么区别吗?

我看了文档,但除了这一行之外:

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

我找不到任何区别。那么它们之间有什么区别呢?两者是否都存在于历史/兼容性方面?

我正在使用Oracle 10gR2版本。

3个回答

43

这是由于历史原因。在Oracle 10g之前,它们曾经不同

在8i和9i版本中,PLS_INTEGER的速度明显快于BINARY_INTEGER。


关于声明和操作整数,Oracle提供了许多选项,包括:

INTEGER - 定义在STANDARD包中,作为NUMBER的子类型,该数据类型以完全独立于平台的方式实现,这意味着无论安装数据库的硬件如何,对NUMBER或INTEGER变量所进行的任何操作都应该能够正常运行。

BINARY_INTEGER - 作为INTEGER的一个子类型定义在STANDARD包中。变量声明为BINARY_INTEGER可以赋值在-231+1 .. 231-1之间的值,即-2,147,483,647到2,147,483,647。在Oracle9i Database Release 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 Database 10g之前,它们比BINARY_INTEGER更快。然而,在Oracle Database 10g中,BINARY_INTEGER和PLS_INTEGER现在是相同的,可以互换使用。


1
这里有9i文档,其中提到了差异,但没有详细说明:http://download.oracle.com/docs/cd/B10500_01/appdev.920/a96624/03_types.htm#10531 无论如何,它现在已经过时了。 - Thilo
但是请看下面的链接: http://www.oracle.com/technetwork/database/features/plsql/documentation/new-plsql-features-in-action-doc-129893.pdfBinary_Integer 的实现基于类似哈希的数据结构,因此在搜索方面应该更快,并且 PLS_INTEGER 用于排序,因为它们是基于 B*-Trees 实现的。 - logeekal

9

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。 - ocarlsen

4

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


1
自Oracle 11.2g以来,这不再是真的。请参见以下示例,它会抛出ORA-01426错误:declare limit binary_integer := 2147483647; begin limit := limit + 1; end; / - alexeionin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接