pls_integer和binary_integer有什么区别?

时间:2011-09-14 07:28:16

标签: oracle plsql oracle10g associative-array

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

其中一些由binary_integers索引,一些由pls_integers索引。这两者之间有什么不同吗?

我看了the documentation,但除此之外:

  

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

我发现两者之间没有任何区别。那有什么区别?是否出于历史/兼容性原因?

我正在使用Oracle 10gR2

3 个答案:

答案 0 :(得分:36)

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

  

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


  

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

     

INTEGER - 在STANDARD包中定义为NUMBER的子类型,此数据类型以完全独立于平台的方式实现,这意味着您使用NUMBER或INTEGER变量执行的任何操作都应该相同,无论硬件位于何处。数据库已安装。

     

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

答案 1 :(得分:7)

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 :(得分:5)

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