Подтвердить что ты не робот

Какая разница между pls_integer и binary_integer?

Я унаследовал некоторый код, который станет базой для некоторой дополнительной работы. Глядя на сохраненные процессы, я вижу довольно много ассоциативных массивов.

Некоторые из них индексируются binary_integers, некоторые - pls_integers. Существуют ли различия между ними?

Я просмотрел документацию, но помимо этой строки:

Типы данных PL/SQL PLS_INTEGER и BINARY_INTEGER идентичны. Для простоты этот документ использует PLS_INTEGER для обозначения как PLS_INTEGER, так и BINARY_INTEGER.

Я не мог найти разницы между ними. Так какая разница? Связаны ли они по причинам истории/совместимости?

Я использую Oracle 10gR2

4b9b3361

Ответ 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 не будут создавать исключение, даже если есть переполнение.