web-dev-qa-db-ja.com

pls_integerとbinary_integerの違いは何ですか?

追加の作業のベースとなるコードを継承しました。ストアドプロシージャを見ると、非常に多くの連想配列があります。

これらの一部はbinary_integersによってインデックス付けされ、一部はpls_integersによってインデックス付けされます。 2つの間に違いはありますか?

ドキュメント を見ましたが、この行は別です:

PL/SQLデータ型PLS_INTEGERおよびBINARY_INTEGERは同一です。簡単にするために、このドキュメントではPLS_INTEGERを使用して両方のPLS_INTEGERおよびBINARY_INTEGER

2つの間に違いは見つかりませんでした。それで、違いは何ですか?歴史的/互換性の理由で両方がありますか?

Oracle 10gR2を使用しています

27
Sathyajith Bhat

歴史的な理由。それらは 10g以前は異なっていた

8iおよび9iでは、PLS_INTEGERはBINARY_INTEGERよりも著しく高速でした。


整数の宣言と操作に関して、Oracleは次のような多くのオプションを提供しています。

INTEGER-STANDARDパッケージでNUMBERのサブタイプとして定義され、このデータ型は完全にプラットフォームに依存しない方法で実装されます。つまり、NUMBER変数またはINTEGER変数で行うことは、データベースがインストールされているハードウェアに関係なく同じように機能することを意味します。

BINARY_INTEGER-STANDARDパッケージでINTEGERのサブタイプとして定義されています。 BINARY_INTEGERとして宣言された変数には、-2の間の値を割り当てることができます31+1 .. 231-1、別名-2,147,483,647〜2,147,483,647。 Oracle9i Databaseリリース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 .. 231-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は同一になり、互換的に使用できます。

37
Thilo

binary_integerpls_integerは両方とも同じです。両方とも、範囲が-2,147,648,467から2,147,648,467のPL/SQLデータ型です。

integerおよびbinary_integerpls_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;
/ 
8
nagu

Pls_integerとbinary_integerのもう1つの違いは、pls_integerを含む計算がオーバーフローすると、PL/SQLエンジンが実行時例外を発生させることです。ただし、binary_integerを含む計算では、オーバーフローが発生しても例外は発生しません。

5
Gebru Welay