PLS_INTEGERおよびBINARY_INTEGERデータ型
PL/SQLのデータ型であるPLS_INTEGER
とBINARY_INTEGER
は同じです。
わかりやすくするために、このマニュアルでは、PLS_INTEGER
とBINARY_INTEGER
の両方を表すためにPLS_INTEGER
を使用します。
PLS_INTEGER
データ型は、32ビットで表される-2147483648から2147483647の範囲の符号付き整数を格納します。
PLS_INTEGER
データ型には、NUMBER
データ型およびNUMBER
サブタイプと比べて、次のようなメリットがあります。
-
PLS_INTEGER
値の方が、必要な記憶域が少なくなります。 -
PLS_INTEGER
演算はハードウェア算術計算を使用するため、ライブラリ算術計算を使用するNUMBER
演算より処理速度が速くなります。
効率のために、PLS_INTEGERの範囲内でのすべての計算にPLS_INTEGER
値を使用してください。
ここでのトピック
PLS_INTEGERのオーバーフローの回避
PLS_INTEGER
範囲をオーバーフローする2つのPLS_INTEGER
値を使用した計算では、オーバーフロー例外が発生します。
PLS_INTEGER
の範囲外の計算には、NUMBER
データ型の事前定義のサブタイプであるINTEGER
を使用します。
例4-21 オーバーフロー例外が発生するPLS_INTEGERの計算
この例では、2つのPLS_INTEGER
値を使用する計算がPLS_INTEGER
の範囲をオーバーフローした場合は、結果をNUMBER
データ型に代入しても、オーバーフロー例外が発生することを示します。
DECLARE p1 PLS_INTEGER := 2147483647; p2 PLS_INTEGER := 1; n NUMBER; BEGIN n := p1 + p2; END; /
結果:
DECLARE
*
ERROR at line 1:
ORA-01426: numeric overflow
ORA-06512: at line 6
例4-22 例4-21のオーバーフローの防止
この例では、PLS_INTEGER
範囲外の計算での事前定義のサブタイプINTEGER
の正しい使用を示しています。
DECLARE
p1 PLS_INTEGER := 2147483647;
p2 INTEGER := 1;
n NUMBER;
BEGIN
n := p1 + p2;
END;
/
結果:
PL/SQL procedure successfully completed.
PLS_INTEGERの事前定義のサブタイプ
このサマリーは、PLS_INTEGER
データ型の事前定義済のサブタイプ、およびそれらが格納するデータを示します。
表4-3 PLS_INTEGERデータ型の事前定義のサブタイプ
データ型 | データの説明 |
---|---|
|
負でない |
|
|
|
正の |
|
|
|
-1、0または1の |
|
|
PLS_INTEGER
およびそのサブタイプは、次のデータ型に暗黙的に変換できます。
-
CHAR
-
VARCHAR2
-
NUMBER
-
LONG
LONG
を除く前述のすべてのデータ型、およびすべてのPLS_INTEGER
サブタイプは、PLS_INTEGER
に暗黙的に変換できます。
PLS_INTEGER
値は、サブタイプの制約に違反していない場合のみ、PLS_INTEGER
サブタイプに暗黙的に変換できます。
関連項目:
-
NOT
NULL
制約の詳細は、「NOT NULL制約」を参照してください -
SIMPLE_INTEGER
の詳細は、「PLS_INTEGERのSIMPLE_INTEGERサブタイプ」を参照してください
例4-23 SIMPLE_INTEGERサブタイプの制約違反
この例は、PLS_INTEGER
値のNULL
をSIMPLE_INTEGER
サブタイプにキャストすると例外が発生することを示しています。
DECLARE a SIMPLE_INTEGER := 1; b PLS_INTEGER := NULL; BEGIN a := b; END; /
結果:
DECLARE * ERROR at line 1: ORA-06502: PL/SQL: value or conversion error ORA-06512: at line 5
PLS_INTEGERのSIMPLE_INTEGERサブタイプ
SIMPLE_INTEGER
は、PLS_INTEGER
データ型の事前定義済のサブタイプです。
SIMPLE_INTEGER
はPLS_INTEGER
と同じ範囲を持ち、NOT
NULL
制約があります。PLS_INTEGER
との大きな違いはオーバーフローの方法です。
変数の値がNULL
になることがなく、オーバーフロー・チェックも不要であるとわかっている場合は、PLS_INTEGER
ではなくSIMPLE_INTEGER
として値を宣言します。SIMPLE_INTEGER
の場合は、NULLかどうかのチェックおよびオーバーフロー・チェックのためのオーバーヘッドが発生しないため、PLS_INTEGER
よりもパフォーマンスが大幅に向上します。
ここでのトピック
SIMPLE_INTEGERのオーバーフローの方法
式に含まれるすべてのオペランドのデータ型がSIMPLE_INTEGER
の場合にのみ、PL/SQLで2の補数算術が使用され、オーバーフローが無視されます。
オーバーフローが無視されるため、値を正から負、または負から正にラップできます。たとえば:
230 + 230 = 0x40000000 + 0x40000000 = 0x80000000 = -231
-231 + -231 = 0x80000000 + 0x80000000 = 0x00000000 = 0
たとえば、次のブロックはエラーなしで実行されます。
DECLARE
n SIMPLE_INTEGER := 2147483645;
BEGIN
FOR j IN 1..4 LOOP
n := n + 1;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(n, 'S9999999999'));
END LOOP;
FOR j IN 1..4 LOOP
n := n - 1;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(n, 'S9999999999'));
END LOOP;
END;
/
結果:
+2147483646 +2147483647 -2147483648 -2147483647 -2147483648 +2147483647 +2147483646 +2147483645 PL/SQL procedure successfully completed.
SIMPLE_INTEGERと他のオペランドの両方を使用する式
SIMPLE_INTEGER
と他のオペランドの両方が式に含まれている場合は、PL/SQLによりSIMPLE_INTEGER
値がPLS_INTEGER
NOT
NULL
に暗黙的に変換されます。
一部の最適化が抑制されてパフォーマンスに悪影響を与えるような状態でSIMPLE_INTEGER
値と他の値が混在している場合は、PL/SQLコンパイラから警告が発行されます。