В чем разница между pls_integer и binary_integer? - PullRequest
27 голосов
/ 14 сентября 2011

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

Некоторые из них индексируются двоичными_интеграторами, некоторые - pls_integers.Есть ли различия между ними?

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

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

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

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

Ответы [ 3 ]

36 голосов
/ 14 сентября 2011

Исторические причины.Они раньше были разными до 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 Database 10g они работают быстрее, чем BINARY_INTEGER.Однако в Oracle Database 10g BINARY_INTEGER и PLS_INTEGER теперь идентичны и могут использоваться взаимозаменяемо.

8 голосов
/ 20 декабря 2011

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;
/ 
5 голосов
/ 29 апреля 2012

Другое различие между pls_integer и binary_integer заключается в том, что при вычислениях с переполнением pls_integer механизм PL / SQL вызывает исключение времени выполнения. Но вычисления с использованием binary_integer не вызовут исключение, даже если произойдет переполнение.

...