我继承了一些代码,这些代码将成为一些额外工作的基础。查看存储过程,我看到了很多关联数组。
其中一些由binary_integers索引,一些由pls_integers索引。这两者之间有什么不同吗?
我看了the documentation,但除此之外:
PL / SQL数据类型
PLS_INTEGER
和BINARY_INTEGER
是相同的。为简单起见,本文档使用PLS_INTEGER表示PLS_INTEGER
和BINARY_INTEGER
。
我发现两者之间没有任何区别。那有什么区别?是否出于历史/兼容性原因?
我正在使用Oracle 10gR2
答案 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_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 :(得分:5)
pls_integer和binary_integer之间的另一个区别是,当涉及pls_integer溢出的计算溢出时,PL / SQL引擎将引发运行时异常。但是,即使存在溢出,涉及binary_integer的计算也不会引发异常。