追加の作業のベースとなるコードを継承しました。ストアドプロシージャを見ると、非常に多くの連想配列があります。
これらの一部はbinary_integersによってインデックス付けされ、一部はpls_integersによってインデックス付けされます。 2つの間に違いはありますか?
ドキュメント を見ましたが、この行は別です:
PL/SQLデータ型
PLS_INTEGER
およびBINARY_INTEGER
は同一です。簡単にするために、このドキュメントではPLS_INTEGERを使用して両方のPLS_INTEGER
およびBINARY_INTEGER
。
2つの間に違いは見つかりませんでした。それで、違いは何ですか?歴史的/互換性の理由で両方がありますか?
Oracle 10gR2を使用しています
歴史的な理由。それらは 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は同一になり、互換的に使用できます。
binary_integer
とpls_integer
は両方とも同じです。両方とも、範囲が-2,147,648,467から2,147,648,467のPL/SQLデータ型です。
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;
/
Pls_integerとbinary_integerのもう1つの違いは、pls_integerを含む計算がオーバーフローすると、PL/SQLエンジンが実行時例外を発生させることです。ただし、binary_integerを含む計算では、オーバーフローが発生しても例外は発生しません。