Какая разница между pls_integer и binary_integer?
Я унаследовал некоторый код, который станет базой для некоторой дополнительной работы. Глядя на сохраненные процессы, я вижу довольно много ассоциативных массивов.
Некоторые из них индексируются binary_integers, некоторые - pls_integers. Существуют ли различия между ними?
Я просмотрел документацию, но помимо этой строки:
Типы данных PL/SQL PLS_INTEGER
и BINARY_INTEGER
идентичны. Для простоты этот документ использует PLS_INTEGER для обозначения как PLS_INTEGER
, так и BINARY_INTEGER
.
Я не мог найти разницы между ними. Так какая разница? Связаны ли они по причинам истории/совместимости?
Я использую Oracle 10gR2
Ответы
Ответ 1
Исторические причины. Они раньше отличались до 10g:
На 8i и 9i PLS_INTEGER был заметно быстрее, чем BINARY_INTEGER.
Когда дело доходит до объявления и управления целыми числами, Oracle предлагает множество опций, в том числе:
INTEGER - определенный в пакете STANDARD как подтип NUMBER, этот тип данных реализуется полностью независимым от платформы образом, что означает, что все, что вы делаете с переменными NUMBER или INTEGER, должно работать одинаково независимо от оборудования, на котором базы данных.
BINARY_INTEGER - определенный в пакете STANDARD в качестве подтипа INTEGER, переменным, объявленным как BINARY_INTEGER, могут быть присвоены значения между -2 31.. 2 31, aka -2,147,483,647 до 2,147,483,647. До Oracle9i Database Release 2 BINARY_INTEGER был единственным типом данных индексирования, разрешенным для ассоциативных массивов (aka, index-by tables), как в:
TYPE my_array_t IS TABLE OF VARCHAR2(100)
INDEX BY BINARY_INTEGER
PLS_INTEGER - определенный в пакете STANDARD как подтип BINARY_INTEGER, переменным, объявленным как PLS_INTEGER, могут быть присвоены значения между -2 31.. 2 31, aka -2,147,483,647 до 2,147,483,647. Операции PLS_INTEGER используют арифметику машины, поэтому они, как правило, быстрее, чем операции NUMBER и INTEGER. Кроме того, до Oracle Database 10g они быстрее, чем BINARY_INTEGER. Однако в Oracle Database 10g BINARY_INTEGER и PLS_INTEGER теперь идентичны и могут использоваться взаимозаменяемо.
Ответ 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;
/
Ответ 3
Другим различием между pls_integer и binary_integer является то, что при вычислении, включающем переполнение pls_integer, механизм PL/SQL вызывает исключение времени выполнения. Но вычисления с использованием binary_integer не будут создавать исключение, даже если есть переполнение.