すべての定数、変数およびパラメータは、記憶形式、制約、値の有効範囲および実行できる演算を決定するデータ型(型とも呼ばれる)を持っています。 PL/SQLには、多くの事前定義のデータ型およびサブタイプが用意されています。また、PL/SQLを使用して、独自のPL/SQLサブタイプを定義することもできます。
サブタイプとは、別のデータ型のサブセットのことです。その別のデータ型は、そのサブタイプのベース型と呼ばれます。 サブタイプには、そのベース型で有効な演算と同じ演算が含まれています。ただし、ベース型の有効な値のサブセットのみが含まれています。 サブタイプを使用すると、信頼性が向上し、ANSI/ISO型との互換性が保たれ、さらに定数や変数の使用意図を示すことで読みやすさが向上します。
この章では、頻繁に使用する基本的な事前定義のPL/SQLのデータ型とサブタイプ、独自のPL/SQLサブタイプを定義して使用する方法およびPL/SQLのデータ型変換について説明します。 特化された事前定義のデータ型については、以降の章を参照してください。
表3-1に、事前定義のPL/SQLデータ型のカテゴリ、それらのデータ型が格納するデータ、および特化されたデータ型に関する情報の参照先を示します。
表3-1 事前定義のPL/SQLデータ型のカテゴリ
データ型のカテゴリ | データの説明 |
---|---|
スカラー |
内部コンポーネントがない単一の値。 |
コンポジット |
個別にアクセスできる内部コンポーネントがあるデータ項目。 詳細は、第5章「PL/SQLのコレクションおよびレコードの使用」を参照してください。 |
参照 |
他のデータ項目へのポインタ。 詳細は、「カーソル変数(REF CURSOR)の使用」を参照してください。 |
ラージ・オブジェクト(LOB) |
他のデータ項目とは別に格納されている大きいオブジェクト(テキスト、図形イメージ、ビデオ・クリップ、サウンド・ウェーブ形式など)へのポインタ。 |
ここでのトピック:
スカラー・データ型は、内部コンポーネントがない単一の値を格納します。 表3-2に、事前定義のPL/SQLのスカラー・データ型、およびそれらが格納するデータを示します。
表3-2 事前定義のPL/SQLのスカラー・データ型のカテゴリ
カテゴリ | データの説明 |
---|---|
数値 |
算術演算を実行できる数値。 |
文字 |
単一文字または文字列を表す操作可能な英数字値。 |
|
論理演算を実行できる論理値。 |
日時 |
操作可能な日付および時刻。 |
時間隔 |
操作可能な時間間隔。 |
ここでのトピック:
数値データ型を使用すると、数値データの格納、量の表現および計算の実行を行うことができます。 表3-3に、事前定義のPL/SQLの数値型、およびそれらが格納するデータを示します。
表3-3 事前定義のPL/SQLの数値データ型
データ型 | データの説明 |
---|---|
|
32ビットで表される-2147483648から2147483647の範囲の符号付き整数。 |
|
単精度のIEEE 754形式の浮動小数点数。 |
|
倍精度のIEEE 754形式の浮動小数点数。 |
|
1E-130から1.0E126(ただし1.0E126を含まない)までの絶対値を持つ固定小数点数または浮動小数点数。 |
ここでのトピック:
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
の範囲外の計算には、NUMBER
データ型の事前定義のサブタイプであるINTEGER
を使用します。
表3-4に、PLS_INTEGER
データ型の事前定義のサブタイプ、およびそれらが格納するデータを示します。
SIMPLE_INTEGER
はPLS_INTEGER
データ型の事前定義のサブタイプです。PLS_INTEGER
と同じ範囲(-2147483648から2147483647)を取り、NOT
NULL
制約を含んでいます。 PLS_INTEGER
との大きな違いはオーバーフローの方法です。
SIMPLE_INTEGER
は、値がNULL
になることがなく、オーバーフロー・チェックが不要な場合に使用できます。 SIMPLE_INTEGER
値に対する算術演算はハードウェアで直接実行されるため、SIMPLE_INTEGER
を使用すると、NULLかどうかのチェックおよびオーバーフロー・チェックのためのオーバーヘッドが発生せず、PLSQL_CODE_TYPE='NATIVE'
の場合、PLS_INTEGER
を使用するよりパフォーマンスが大幅に向上します。 PLSQL_CODE_TYPE='INTERPRETED'
の場合、パフォーマンスの向上は少なくなります。
ここでのトピック:
SIMPLE_INTEGER
のオーバーフローの方法は、PLS_INTEGER
のオーバーフローの方法とは大きく異なります。 PLS_INTEGER
値を2147483647より大きくする算術演算、またはPLS_INTEGER値を-2147483648より小さくする算術演算を実行すると、エラーORA-01426が発生します。一方、SQL*Plusから次のPL/SQLブロックを実行すると、このブロックはエラーが発生することなく実行されます。
SQL> DECLARE
2 n SIMPLE_INTEGER := 2147483645;
3 BEGIN
4 FOR j IN 1..4 LOOP
5 n := n + 1;
6 DBMS_OUTPUT.PUT_LINE(TO_CHAR(n, 'S9999999999'));
7 END LOOP;
8 FOR j IN 1..4 LOOP
9 n := n - 1;
10 DBMS_OUTPUT.PUT_LINE(TO_CHAR(n, 'S9999999999'));
11 END LOOP;
12 END;
13 /
+2147483646
+2147483647
-2147483648
-2147483647
-2147483648
+2147483647
+2147483646
+2147483645
PL/SQL procedure successfully completed.
SQL>
オーバーロードされたサブプログラムでは、SIMPLE_INTEGER
の実パラメータとPLS_INTEGER
の実パラメータを相互に代用できます。
それらのすべてのオペランドまたは引数のデータ型がSIMPLE_INTEGER
の場合は、2の補数算術が使用され、オーバーフローが無視されて、次のSIMPLE_INTEGER
結果が生成されます。
演算子:
加算(+)
減算(-)
乗算(*)
組込みファンクション:
MAX
MIN
ROUND
SIGN
TRUNC
CASE
式
すべてではなく一部のオペランドまたは引数のデータ型がSIMPLE_INTEGER
の場合、データ型SIMPLE_INTEGER
のオペランドまたは引数は、PLS_INTEGER
NOT
NULL
に暗黙的にキャストされます。
SIMPLE_INTEGER
の範囲内の整数リテラルのデータ型はSIMPLE_INTEGER
になります。 このため、2の補数算術を使用して計算される算術式で、各整数リテラルをSIMPLE_INTEGER
に明示的にキャストする必要がなくなります。
すべてのオペランドおよび引数のデータ型がSIMPLE_INTEGER
の場合にのみ、PL/SQLで2の補数算術が使用され、オーバーフローが無視されます。 オーバーフローが無視されるため、値を正から負、または負から正にラップできます。次に例を示します。
230 + 230 = 0x40000000 + 0x40000000 = 0x80000000 = -231
-231 + -231 = 0x80000000 + 0x80000000 = 0x00000000 = 0
算術式内のすべてのオペランドが整数リテラルである場合、PL/SQLでは、下位互換性を確保するために、PLS_INTEGER
にキャストされた場合と同様にその整数リテラルが処理されます。
PLS_INTEGER
値をSIMPLE_INTEGER
データ型に強制変換するキャスト演算では、ソース値がNULL
でない場合、変換は行われません。 ソース値がNULL
の場合は、ランタイム例外が発生します。
SIMPLE_INTEGER
値をPLS_INTEGER
データ型に強制変換するキャスト演算では、変換は行われません。 この演算は常に成功します(例外は発生しません)。
コンパイラは、次の場合に警告を発行します。
1つの演算で、SIMPLE_INTEGER
値がその他の数値型の値と混用されている場合。
PLS_INTEGER
が期待されている箇所で、SIMPLE_INTEGER
値がパラメータ、バインドまたは定義として渡される場合。
BINARY_FLOAT
およびBINARY_DOUBLE
データ型は、それぞれ単精度および倍精度のIEEE 754形式の浮動小数点数を表します。
BINARY_FLOAT
リテラルは、末尾にf
が付きます(2.07f
など)。 BINARY_DOUBLE
リテラルは、末尾にd
が付きます(3.000094d
など)。
BINARY_FLOAT
およびBINARY_DOUBLE
の計算では、例外は発生しません。このため、表3-5に示されている事前定義の定数を使用して、これらの計算によって生成された値をオーバーフローやアンダーフローなどの条件に関して確認する必要があります。 次に例を示します。
SELECT COUNT(*) FROM employees WHERE salary < BINARY_FLOAT_INFINITY;
表3-5 事前定義のPL/SQLのBINARY_FLOATおよびBINARY_DOUBLEの定数1
定数 | 説明 |
---|---|
|
条件 |
|
単精度の正の無限大。 |
|
最大正規 |
|
最小正規 |
|
最大非正規 |
|
最小非正規 |
|
条件 |
|
倍精度の正の無限大。 |
|
最大正規 |
|
最小正規 |
|
最大非正規 |
|
最小非正規 |
1SQLによっても事前定義されます。
IEEE-754標準では、アンダーフローによって発生する問題をなくすために非正規値の範囲が使用されます。
BINARY_FLOAT
データ型およびBINARY_DOUBLE
データ型は、「計算集中型PL/SQLプログラムの記述」で説明されているように、主に科学的な高速計算に使用されます。
SIMPLE_FLOAT
およびSIMPLE_DOUBLE
は、それぞれBINARY_FLOAT
およびBINARY_DOUBLE
データ型の事前定義のサブタイプです。 各サブタイプはそのベース型と同じ範囲を取り、NOT
NULL
制約を含んでいます。
SIMPLE_INTEGER
およびSIMPLE_DOUBLE
は、値がNULL
になることがない場合に使用できます。 SIMPLE_FLOAT
およびSIMPLE_DOUBLE
値に対する算術演算はハードウェアで直接実行されるため、SIMPLE_FLOAT
およびSIMPLE_DOUBLE
を使用すると、NULLかどうかのチェックのためのオーバーヘッドが発生せず、PLSQL_CODE_TYPE='NATIVE'
の場合、BINARY_FLOAT
およびBINARY_DOUBLE
を使用するよりパフォーマンスが大幅に向上します。 PLSQL_CODE_TYPE='INTERPRETED'
の場合、パフォーマンスの向上は少なくなります。
NUMBER
データ型は、1E-130
から1.0E126
(ただし1.0E126を含まない)までの絶対値を持つ固定小数点数または浮動小数点数を格納します。 NUMBER
変数は0
を表すこともできます。
指定した範囲内のNUMBER
リテラルおよびNUMBER
の計算結果のみを使用することをお薦めします。 そうしない場合、次の状況が発生します。
小さすぎる値は、0(ゼロ)に丸められます。
リテラル値が大きすぎる場合は、コンパイル・エラーが発生します。
計算結果が大きすぎる場合、計算結果は未定義となり、信頼性がなくなります。ランタイム・エラーが発生する可能性もあります。
NUMBER
値には、精度(precision)と位取り(scale)の両方があります。精度(precision)は全体の桁数を表し、位取り(scale)は小数点以下の桁数を表します。
固定小数点NUMBER
を指定するための構文は、次のとおりです。
NUMBER(precision, scale)
次に例を示します。
NUMBER(8,2)
整数の場合、位取り(scale)は0(ゼロ)です。 整数NUMBER
を指定するための構文は、次のとおりです。
NUMBER(precision)
次に例を示します。
NUMBER(2)
浮動小数点数では、小数点は任意の位置に浮動できます。 浮動小数点NUMBER
を指定するための構文は、次のとおりです。
NUMBER
precision
とscale
は両方とも、定数または変数ではなく、整数リテラルである必要があります。
precision
の最大値は38です。デフォルト値は、39、40、または使用しているシステムでの最大値のうちの最も小さい値になります。
scale
の最小値は-84、最大値は127です。 デフォルト値は0(ゼロ)です。
位取り(scale)によって、四捨五入の位置が決まります。 たとえば、位取り(scale)が2と指定されている値は、小数点以下2桁に四捨五入されます(3.454は3.45になり、3.456は3.46になります)。 負の位取り(scale)を指定すると、小数点の左側で四捨五入されます。 たとえば、位取り(scale)が-3と指定されている値は、1000の位で四捨五入されます(34462は34000になり、34562は35000になります)。 位取り(scale)が0(ゼロ)と指定されている値は、最も近い整数に四捨五入されます(3.4562は3になり、3.56は4になります)。
NUMBER
データ型の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
表3-6に、NUMBER
データ型の事前定義のサブタイプ、およびそれらが格納するデータを示します。
文字データ型を使用すると、単一文字または文字列を表す操作可能な英数字値を格納できます。 表3-7に、事前定義のPL/SQLの文字型、およびそれらが格納するデータを示します。
表3-7 事前定義のPL/SQLの文字データ型1
データ型 | データの説明 |
---|---|
|
最大サイズが32767バイトである固定長の文字列。 |
|
最大サイズが32767バイトである可変長の文字列。 |
|
PL/SQLによって解釈されない、最大サイズが32767バイトである可変長のバイナリ文字列またはバイト文字列。 |
|
最大サイズが32767バイトである固定長の各国語キャラクタ文字列。 |
|
最大サイズが32767バイトである可変長の各国語キャラクタ文字列。 |
|
最大サイズが32760バイトである可変長の文字列。 |
|
PL/SQLによって解釈されない、最大サイズが32760バイトである可変長のバイナリ文字列またはバイト文字列。 |
|
通常の表内の行のアドレスである物理行識別子。 |
|
ユニバーサル行識別子(物理行識別子、論理識別子または外部行識別子)。 |
1既存のアプリケーションとの下位互換性のためにのみサポートされています。
ここでのトピック:
CHAR
データ型は固定長の文字列を格納し、VARCHAR2
データ型は可変長の文字列を格納します。 すべての文字列リテラルは、CHAR
データ型を持っています。
CHAR
およびVARCHAR2
データの内部表現形式は、CREATE
DATABASE
文のCHARACTER
SET
句によって指定されたデータベース・キャラクタ・セットによって異なります。詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
CHAR
またはVARCHAR2
データ項目を指定するための構文は、次のとおりです。
[ CHAR | VARCHAR2 ] [( maximum_size [ CHAR | BYTE ] )]
次に例を示します。
CHAR VARCHAR2 CHAR(10 CHAR) VARCHAR2(32 BYTE)
maximum_size
は、定数または変数ではなく、1から32767の範囲の整数リテラルである必要があります。 デフォルト値は1です。
デフォルトのサイズ単位(CHAR
またはBYTE
)は、NLS_LENGTH_SEMANTICS
初期化パラメータによって決定されます。 PL/SQLサブプログラムのコンパイル時には、このパラメータの設定が記録されるため、サブプログラムが無効になった後に再コンパイルするときにも同じ設定が使用されます。 NLS_LENGTH_SEMANTICS
の詳細は、『Oracle Databaseリファレンス』を参照してください。
CHAR
またはVARCHAR2
データ項目の最大サイズは、maximum_size
を文字数で指定するか、バイト数で指定するかに関係なく、32767バイトです。 CHAR
またはVARCHAR2
データ項目の最大文字数は、キャラクタ・セットのエンコード方法によって異なります。 シングルバイト・キャラクタ・セットでは、CHAR
またはVARCHAR2
データ項目の最大サイズは32767文字です。 nバイトのキャラクタ・セットでは、CHAR
またはVARCHAR2
データ項目の最大サイズは32767/n文字です。この最大サイズの少数点以下は切り捨てられ、最も近い整数になります。 マルチバイトのキャラクタ・セットでは、CHAR(
n
)
またはVARCHAR2(
n
)
変数でn個のマルチバイト文字を格納できるようにmaximum_size
を文字数で指定します。
文字変数に代入した文字値がこの変数の最大サイズより長い場合、PL/SQLはこの値を切り捨てたり、後続する空白を削除せずに、代入を中止して、事前定義の例外VALUE_ERROR
を呼び出します。
たとえば、次のような宣言があるとします。
acronym CHAR(4);
次のような代入を試みるとVALUE_ERROR
が呼び出されます。
acronym := 'SPCA '; -- note trailing blank
データベース列に挿入した文字値が定義されている列幅より長い場合、PL/SQLはこの値を切り捨てたり、後続する空白を削除せずに、挿入を中止して例外を呼び出します。
文字値を変数に代入したり、データベース列に挿入する前に、その文字値から後続する空白を削除するには、組込みファンクションRTRIM
を使用します。 たとえば、前述の宣言の場合、次の代入を実行しても例外は呼び出されません。
acronym := RTRIM('SPCA '); -- note trailing blank
RTRIM
の構文は、『Oracle Database SQL言語リファレンス』を参照してください。
CHAR
とVARCHAR2
のデータ型は、次の点で異なっています。
CHAR
データ型には、CHARACTER
という1つの事前定義のサブタイプがあります。 VARCHAR2
データ型には、VARCHAR
とSTRING
という2つの事前定義のサブタイプがあります。 これらの各サブタイプはそれぞれのベース型と同じ値の範囲を取り、ANSI/ISOおよびIBM型との互換性を保つためにそれぞれのベース型のかわりに使用できます。
注意: PL/SQLの今後のリリースでのVARCHAR は、新しいSQL標準に従うために別のデータ型になり、VARCHAR2 と同義ではなくなる可能性があります。 |
CHAR
変数または最大サイズが2000バイト未満のVARCHAR2
変数の場合、PL/SQLは、コンパイル時に最大サイズに対応できる十分なメモリーを割り当てます。 最大サイズが2000バイト以上のVARCHAR2
の場合、PL/SQLは、実行時に実際の値を格納するための十分なメモリーを割り当てます。 このようにして、PL/SQLは、VARCHAR2
変数が小さい場合はパフォーマンスに応じて変数を最適化し、大きい場合はメモリーを効率的に使用するために変数を最適化します。
たとえば、VARCHAR2(1999 BYTE)
変数とVARCHAR2(2000 BYTE)
変数に同じ500バイトの値を代入すると、PL/SQLは、前者の変数にはコンパイル時に1999バイト、後者の変数には実行時に500バイトを割り当てます。
次の各状況では、PL/SQLによって文字値が空白で埋められるかどうかが、受信者のデータ型によって異なります。
PL/SQLの文字変数に代入した文字値がこの変数の最大サイズより短い。
文字データベース列に挿入した文字値が定義されている列幅より短い。
文字データベース列から取り出してPL/SQLの文字変数に入れた値が、この変数の最大長より短い。
受信者のデータ型がCHAR
の場合、PL/SQLは最大サイズになるまで値を空白で埋めます。 元の値の後続する空白に関する情報は失われます。
たとえば、次の文では、last_name
に代入された値の後に、1つのみではなく6つの空白が含まれます。
last_name CHAR(10) := 'CHEN '; -- note trailing blank
受信者のデータ型がVARCHAR2
の場合、PL/SQLは値の空白埋めも、後続する空白の削除もしません。 文字値はそのまま代入され、情報は失われません。
表2-4の関係演算子を使用すると、文字値を比較できます。 文字値の比較では、データベース・キャラクタ・セットに使用される照合順番で後の文字値が大きくなります。 次の例では、IF
条件はTRUE
です。
SQL> DECLARE
2 last_name1 VARCHAR2(10) := 'COLES';
3 last_name2 VARCHAR2(10) := 'COLEMAN';
4 BEGIN
5 IF last_name1 > last_name2 THEN
6 DBMS_OUTPUT.PUT_LINE
7 (last_name1 || ' is greater than ' || last_name2);
8 ELSE
9 DBMS_OUTPUT.PUT_LINE
10 (last_name2 || ' is greater than ' || last_name1 );
11 END IF;
12 END;
13 /
COLES is greater than COLEMAN
PL/SQL procedure successfully completed.
SQL>
等しくなるには、2つの文字値の長さが同じである必要があります。
両方の値のデータ型がCHAR
の場合、PL/SQLは、これらの値を比較する前に、短い方の値に長い方の値と同じ長さになるまで空白を埋めます。 例3-1では、IF
条件はTRUE
です。
いずれかの値のデータ型がVARCHAR2
の場合、PL/SQLは、これらの値を比較する前に、これらの値の長さを調整することはありません。 例3-2と例3-3のいずれも、IF
条件はFALSE
です。
例3-1 2つのCHAR値の比較
SQL> DECLARE 2 last_name1 CHAR(5) := 'BELLO'; -- no trailing blanks 3 last_name2 CHAR(10) := 'BELLO '; -- trailing blanks 4 BEGIN 5 IF last_name1 = last_name2 THEN 6 DBMS_OUTPUT.PUT_LINE 7 (last_name1 || ' is equal to ' || last_name2); 8 ELSE 9 DBMS_OUTPUT.PUT_LINE 10 (last_name2 || ' is not equal to ' || last_name1); 11 END IF; 12 END; 13 / BELLO is equal to BELLO PL/SQL procedure successfully completed. SQL>
例3-2 2つのVARCHAR2値の比較
SQL> DECLARE 2 last_name1 VARCHAR2(10) := 'DOW'; -- no trailing blanks 3 last_name2 VARCHAR2(10) := 'DOW '; -- trailing blanks 4 BEGIN 5 IF last_name1 = last_name2 THEN 6 DBMS_OUTPUT.PUT_LINE 7 (last_name1 || ' is equal to ' || last_name2 ); 8 ELSE 9 DBMS_OUTPUT.PUT_LINE 10 (last_name2 || ' is not equal to ' || last_name1); 11 END IF; 12 END; 13 / DOW is not equal to DOW PL/SQL procedure successfully completed. SQL>
例3-3 CHAR値とVARCHAR2値の比較
SQL> DECLARE 2 last_name1 VARCHAR2(10) := 'STAUB'; 3 last_name2 CHAR(10) := 'STAUB'; -- PL/SQL blank-pads value 4 BEGIN 5 IF last_name1 = last_name2 THEN 6 DBMS_OUTPUT.PUT_LINE 7 (last_name1 || ' is equal to ' || last_name2); 8 ELSE 9 DBMS_OUTPUT.PUT_LINE 10 (last_name2 || ' is not equal to ' || last_name1 ); 11 END IF; 12 END; 13 / STAUB is not equal to STAUB PL/SQL procedure successfully completed. SQL>
CHAR
データベース列に挿入できる最大のCHAR
値は、2000バイトです。
VARCHAR2
データベース列に挿入できる最大のVARCHAR2
値は、4000バイトです。
LONG
列の最大幅は2147483648バイト(2GB)であるため、すべてのCHAR
値またはVARCHAR2
値をLONG
データベース列に格納できます。 ただし、LONG
列から32767バイトを超える長さの値を取り出してCHAR
変数またはVARCHAR2
変数に入れることはできません (LONG
データ型は、既存のアプリケーションとの下位互換性のためにのみ使用してください。 詳細は、「LONGおよびLONG RAWデータ型」を参照してください。)
RAW
データ型は、図形文字の並びやデジタル化された絵といったバイナリまたはバイト列を格納します。 RAWデータはVARCHAR2
データと似ていますが、PL/SQLによって解釈されない点が異なります。 RAWデータをシステム間で送信する際に、Oracle Netはキャラクタ・セット変換を実行しません。
RAW
データ項目を指定するための構文は、次のとおりです。
RAW (maximum_size)
次に例を示します。
RAW(256)
maximum_size
(バイト単位)は、定数または変数ではなく、1から32767の範囲の整数リテラルである必要があります。 デフォルト値は1です。
RAW
データベース列に挿入できる最大のRAW
値は、2000バイトです。
LONG
RAW
列の最大幅は、2147483648バイト(2GB)であるため、すべてのRAW
値をLONG
RAW
データベース列に格納できます。 ただし、LONG
RAW
列から32768バイト以上の値を取り出してRAW
変数に入れることはできません。 (LONG
RAW
データ型は、既存のアプリケーションとの下位互換性のためにのみ使用してください。 詳細は、「LONGおよびLONG RAWデータ型」を参照してください。)
NCHAR
データ型は固定長の各国語キャラクタ文字列を格納し、NVARCHAR2
データ型は可変長の各国語キャラクタ文字列を格納します。
各国語キャラクタ文字列は、各国語キャラクタ・セットからの文字で構成されています。各国語キャラクタ・セットは、何千もの文字を持つ言語(日本語など)を表現するために使用されます。各文字に、2バイトまたは3バイトが必要です。
NCHAR
およびNVARCHAR2
データの内部表現形式は、CREATE
DATABASE
文のNATIONAL
CHARACTER
SET
句によって指定された各国語キャラクタ・セットによって異なります。詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
ここでのトピック:
各国語キャラクタ・セットでは、データはAL16UTF16
またはUTF8
エンコーディングを使用してUnicodeとして表されます。 表3-8では、AL16UTF16
とUTF8
エンコーディングを比較しています。
表3-8 AL16UTF16とUTF8エンコーディングの比較
エンコーディング | 文字サイズ(バイト) | メリット | デメリット |
---|---|---|---|
|
2 |
文字列長を簡単に計算できます。この計算は、複数のプログラミング言語が混在する場合に、切捨てエラーを回避するために実行する必要があります。 |
主にASCIIまたはEBCDIC文字で構成されている文字列によって、必要以上の領域が使用されます。 |
|
1、2または3 |
ほとんどの文字で1バイトのみが使用される場合、変数または表の列に、より多数の文字を入れることができます。 |
データをバイト単位のバッファに転送すると、切捨てエラーになる可能性があります。 |
最大限の信頼性が得られるように、できるかぎりデフォルトのAL16UTF16
エンコーディングを使用することをお薦めします。 UTF
エンコーディングを使用するには、CREATE
DATABASE
文のNATIONAL
CHARACTER
SET
句でこのエンコーディングを指定します。
Unicode文字列に必要なバイト数を判断するには、組込みファンクションLENGTHB
を使用してください。
CREATE
DATABASE
文のNATIONAL
CHARACTER
SET
句およびLENGTHB
ファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
各国語キャラクタ・セットの詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。
NCHAR
データ型は固定長の各国語キャラクタ文字列を格納します。 この型は常にマルチバイト文字に対処できるため、Unicode文字データの格納に使用できます。
NCHAR
データ項目を指定するための構文は、次のとおりです。
NCHAR [(maximum_size)]
次に例を示します。
NCHAR NCHAR(100)
maximum_size
は、定数または変数ではなく、整数リテラルである必要があります。 これは最大バイト数ではなく、最大文字数を表します。値は32767です。指定できる最大のmaximum_size
は、AL16UTF16
エンコーディングを使用する場合は32767/2、UTF8
エンコーディングを使用する場合は32767/3です。 デフォルト値は1です。
NCHAR
データベース列に挿入できる最大のNCHAR
値は、2000バイトです。
NCHAR
値がNCHAR
列の定義された幅より短ければ、PL/SQLは定義幅まで値を空白で埋めます。
CHAR
およびNCHAR
値は、文と式の中で交換できます。 常に安全にCHAR
値をNCHAR
値に変換できますが、CHAR
値のキャラクタ・セットでNCHAR
値のすべての文字を表すことができない場合は、NCHAR
値をCHAR
値に変換するとデータが失われる場合があります。 このようなデータの消失が発生すると、各文字では通常は疑問符(?)のようになります。
NVARCHAR2
データ型は可変長の各国語キャラクタ文字列を格納します。 この型は常にマルチバイト文字に対処できるため、Unicode文字データの格納に使用できます。
NVARCHAR2
データ項目を指定するための構文は、次のとおりです。
NVARCHAR2 (maximum_size)
次に例を示します。
NVARCHAR2(300)
maximum_size
は、定数または変数ではなく、整数リテラルである必要があります。 これは最大バイト数ではなく、最大文字数を表します。値は32767です。指定できる最大のmaximum_size
は、AL16UTF16
エンコーディングを使用する場合は32767/2、UTF8
エンコーディングを使用する場合は32767/3です。 デフォルト値は1です。
NVARCHAR2
データベース列に挿入できる最大のNVARCHAR2
値は、4000バイトです。
VARCHAR2
およびNVARCHAR2
値は、文と式の中で交換できます。 VARCHAR2
値をNVARCHAR2
値に変換するのは常に問題ありませんが、NVARCHAR2
値のすべての文字がVARCHAR2
値のキャラクタ・セットで表せるとはかぎらない場合は、NVARCHAR2
値をVARCHAR2
値に変換するとデータが失われる場合があります。 このようなデータの消失が発生すると、各文字では通常は疑問符(?)のようになります。
注意: LONG およびLONG RAW データ型は、既存アプリケーションとの下位互換性のためにのみ使用してください。 新規アプリケーションには、LONG のかわりにCLOB またはNCLOB を、LONG RAW のかわりにBLOB またはBFILE を使用してください。 また、既存のLONG およびLONG RAW データ型は、LOB データ型に置き換えることをお薦めします。 詳細は、「事前定義のPL/SQLのラージ・オブジェクト(LOB)・データ型」を参照してください。 |
LONG
データ型は可変長の文字列を格納します。 LONG
データ型は、LONG
値の最大サイズが(32767バイトではなく)32760バイトであるという点を除けば、VARCHAR2
データ型と同じです。
LONG
RAW
データ型はバイナリまたはバイト文字列を格納します。 LONG
RAW
データは、LONG
RAW
データがPL/SQLによって解釈されないという点を除けば、LONG
データと同じです。 LONG
RAW
値の最大サイズは32760バイトです。
LONG
またはLONG
RAW
データベース列の最大幅は2147483648バイト(2GB)であるため、すべてのLONG
値をLONG
列、すべてのLONG
RAW
値をLONG
RAW
列に格納できます。 ただし、32760バイトを超える長さの値をLONG
列から取り出してLONG
変数に入れたり、LONG RAW
列から取り出してLONG RAW
変数に入れることはできません。
LONG
型のデータベース列にはテキスト、文字の配列、短いドキュメントなどを格納できます。
参照: SQL文内のLONG 列の参照の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
内部的に、すべてのデータベース表には、ROWIDというバイナリ値を格納するROWID
擬似列があります。 各ROWIDは、行の記憶域アドレスを表します。 物理ROWIDは、通常の表の行を識別します。 論理ROWIDは、索引構成表の行を識別します。 ROWID
データ型には物理ROWIDのみ格納でき、UROWID
(ユニバーサルROWID)データ型には物理ROWID、論理ROWID、外部(データベース以外)ROWIDを格納できます。
注意: ROWID データ型は、既存のアプリケーションとの下位互換性のためにのみ使用してください。 新しいアプリケーションの場合には、UROWID データ型を使用します。 |
物理ROWIDは、複数のコミットにまたがってフェッチする場合に便利です(例6-42を参照)。
ROWIDを取り出してROWID
変数に入れる場合は、バイナリ値を18バイトの文字列に変換する組込みファンクションROWIDTOCHAR
を使用します。 逆に、ファンクションCHARTOROWID
はROWID
文字列をROWIDに変換します。 文字列が有効なROWIDを表していないために変換が失敗すると、PL/SQLは事前定義の例外SYS_INVALID_ROWID
を発生します。 これは、暗黙的な変換にも適用されます。
UROWID
変数と文字列間で変換するには、ファンクション・コールなしで通常の代入文を使用します。 値は、UROWID
とキャラクタ・タイプの間で暗黙的に変換されます。
参照:
|
BOOLEAN
データ型は、論理演算で使用できる論理値を格納します。 論理値には、ブール値(TRUE
とFALSE
)およびNULL
値があります。
BOOLEAN
データ項目を指定するための構文は、次のとおりです。
BOOLEAN
SQLにはBOOLEAN
に相当するデータ型がありません。このため、次の文またはファンクション内ではBOOLEAN
変数またはパラメータを使用できません。
SQL文
組込みSQLファンクション(TO_CHAR
など)
SQL文から起動されるPL/SQLファンクション
データベース列に値TRUE
やFALSE
を挿入できません。 データベース列の値を取り出してBOOLEAN
変数に入れることはできません。
BOOLEAN
値を出力に表示するには、IF-THEN
構造体またはCASE
構造体を使用して、BOOLEAN
値を別の型(0または1、YまたはN、trueまたはfalseなど)に変換します。
この項で説明するデータ型を使用すると、日付、時刻および時間隔(期間)を格納し、操作できます。 日付および時刻データ型の変数には日時と呼ばれる値が格納されます。 時間隔データ型の変数には時間隔と呼ばれる値が格納されます。 日時または時間隔は、その値を決定するフィールドで構成されます。 次のリストに、各フィールドの有効値を示します。
フィールド名 | 有効な日時値 | 有効な時間隔値 |
---|---|---|
YEAR |
-4712から9999(年0を除く) | 0以外の任意の整数 |
MONTH |
01から12 | 0から11 |
DAY |
01から31(ロケールのカレンダの規則に従ってMONTH およびYEAR の値による制限付き) |
0以外の任意の整数 |
HOUR |
00から23 | 0から23 |
MINUTE |
00から59 | 0から59 |
SECOND |
00から59.9(n)、9(n)は時刻の秒の精度 | 0から59.9(n)、9(n)は時間隔の秒の精度 |
TIMEZONE_HOUR |
-12から14(範囲は夏時間の変更に対応) | 該当なし |
TIMEZONE_MINUTE |
00から59 | 該当なし |
TIMEZONE_REGION |
動的パフォーマンス・ビューV$TIMEZONE_NAMES に表示 |
該当なし |
TIMEZONE_ABBR |
動的パフォーマンス・ビューV$TIMEZONE_NAMES に表示 |
該当なし |
TIMESTAMP
WITH
LOCAL
TIMEZONE
を除き、前述の型はすべてSQL92規格の一部です。 日時および時間隔のフォーマット・モデル、リテラル、タイムゾーン名およびSQLファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
ここでのトピック:
DATE
データ型は、午前0時からの経過秒数を含む固定長の日時の格納に使用します。 デフォルトでは、日付部分は現在の月の最初の日であり、時刻の部分は午前0時です。 日付関数SYSDATE
は、現在の日付と時刻を戻します。
日付の等価性を各日付の時刻の部分に関係なく比較するには、比較、GROUP BY
操作などにファンクションの結果TRUNC(
date_variable
)
を使用します。
DATE変数の時刻の部分のみを確認するには、日付の部分を引きます(date_variable - TRUNC(
date_variable
)
)。
使用できる日付は、紀元前4712年1月1日から西暦9999年12月31日までです。 ユリウス日付は、紀元前4712年1月1日からの日数です。 ユリウス日付によって、共通の参照元からの連続した日付が可能になります。 日付関数TO_DATE
とTO_CHAR
で日付書式モデル'J'
を使用すると、DATE
値とそれに対応するユリウス日付の値の間で変換できます。
日付式の中では、デフォルトの日付書式の文字値は自動的にDATE
値に変換されます。 デフォルトの日付書式は、Oracle初期化パラメータNLS_DATE_FORMAT
によって設定されます。 たとえば、デフォルトは'DD-MON-YY'
であり、これは2桁数字の日、月の省略名、年数の下2桁を含むものということです。
日付に対しては加算および減算ができます。 算術式の中では、PL/SQLは整数リテラルを日数として解釈します。 たとえば、SYSDATE
+ 1は、次の日の同じ時刻ということです。
TIMESTAMP
データ型はDATE
データ型への拡張であり、年、月、日、時間、分および秒が格納されます。 次に構文を示します。
TIMESTAMP[(precision)
オプションのprecision
パラメータでは、秒のフィールドの小数部の桁数を指定します。 精度には0から9の範囲の整数リテラルを指定します。シンボリック定数や変数は指定できません。デフォルトは6です。
デフォルトのタイムスタンプ日付書式は、Oracle初期化パラメータNLS_TIMESTAMP_FORMAT
によって設定されます。
例3-4では、TIMESTAMP
型の変数を宣言して、その変数にリテラル値を代入します。 秒フィールドの小数部は0.275です。
例3-4 TIMESTAMP変数へのリテラル値の代入
SQL> DECLARE 2 checkout TIMESTAMP(3); 3 BEGIN 4 checkout := '22-JUN-2004 07:48:53.275'; 5 DBMS_OUTPUT.PUT_LINE( TO_CHAR(checkout)); 6 END; 7 / 22-JUN-04 07.48.53.275 AM PL/SQL procedure successfully completed. SQL>
例3-5では、SCN_TO_TIMESTAMP
およびTIMESTAMP_TO_SCN
ファンクションは、TIMESTAMP
を操作するために使用されます。
例3-5 SCN_TO_TIMESTAMPおよびTIMESTAMP_TO_SCNファンクションの使用
SQL> DECLARE 2 right_now TIMESTAMP; 3 yesterday TIMESTAMP; 4 sometime TIMESTAMP; 5 scn1 INTEGER; 6 scn2 INTEGER; 7 scn3 INTEGER; 8 BEGIN 9 right_now := SYSTIMESTAMP; 10 scn1 := TIMESTAMP_TO_SCN(right_now); 11 DBMS_OUTPUT.PUT_LINE('Current SCN is ' || scn1); 12 13 yesterday := right_now - 1; 14 scn2 := TIMESTAMP_TO_SCN(yesterday); 15 DBMS_OUTPUT.PUT_LINE('SCN from yesterday is ' || scn2); 16 17 -- Find arbitrary SCN between yesterday and today 18 19 scn3 := (scn1 + scn2) / 2; 20 sometime := SCN_TO_TIMESTAMP(scn3); 21 DBMS_OUTPUT.PUT_LINE 22 ('SCN ' || scn3 || ' was in effect at ' || TO_CHAR(sometime)); 23 END; 24 / Current SCN is 3945848 SCN from yesterday is 3899547 SCN 3922698 was in effect at 03-JAN-08 10.00.06.000000 PM PL/SQL procedure successfully completed. SQL>
TIMESTAMP
WITH
TIME
ZONE
データ型は、TIMESTAMP
データ型への拡張であり、タイムゾーンによる時差を含みます。 タイムゾーンによる時差とは、現地時間と協定世界時(UTC、旧称はグリニッジ標準時(GMT))の時差(時間および分単位)です。 次に構文を示します。
TIMESTAMP[(precision)] WITH TIME ZONE
オプションのprecision
パラメータでは、秒のフィールドの小数部の桁数を指定します。 精度には0から9の範囲の整数リテラルを指定します。シンボリック定数や変数は指定できません。デフォルトは6です。
デフォルトのタイムゾーン付きタイムスタンプの書式は、Oracle初期化パラメータNLS_TIMESTAMP_TZ_FORMAT
によって設定されます。
例3-6では、TIMESTAMP
WITH
TIME
ZONE
型の変数を宣言して、その変数にリテラル値を代入します。 タイムゾーンによる時差は+02:00です。
例3-6 TIMESTAMP WITH TIME ZONE変数へのリテラルの代入
SQL> DECLARE 2 logoff TIMESTAMP(3) WITH TIME ZONE; 3 BEGIN 4 logoff := '10-OCT-2004 09:42:37.114 AM +02:00'; 5 DBMS_OUTPUT.PUT_LINE (TO_CHAR(logoff)); 6 END; 7 / 10-OCT-04 09.42.37.114 AM +02:00 PL/SQL procedure successfully completed. SQL>
また、シンボリック名でタイムゾーンを指定することもできます。 この指定には、'US/Pacific'
などの長い形式、'PDT'
などの省略形またはその組合せを使用できます。 たとえば、次のリテラルはいずれも同じ時刻を表します。 3番目は、夏時間に切り替わった時点で適用される規則を指定しているため、最も信頼性の高い書式です。
TIMESTAMP '15-APR-2004 8:00:00 -8:00' TIMESTAMP '15-APR-2004 8:00:00 US/Pacific' TIMESTAMP '31-OCT-2004 01:30:00 US/Pacific PDT'
タイムゾーンに使用可能な名前は、静的データ・ディクショナリ・ビューV$TIMEZONE_NAMES
のTIMEZONE_REGION
およびTIMEZONE_ABBR
列にあります。
2つのTIMESTAMP
WITH
TIME
ZONE
値は、UTCで同じ時間を表していれば、タイムゾーンによる時差に関係なく同一とみなされます。 たとえば、UTCの太平洋標準時で午前8:00は東部標準時の午前11:00と同じであるため、次の2つの値は同一とみなされます。
'29-AUG-2004 08:00:00 -8:00' '29-AUG-2004 11:00:00 -5:00'
TIMESTAMP
WITH
LOCAL
TIME
ZONE
データ型は、TIMESTAMP
データ型の拡張であり、タイムゾーンによる時差を含みます。 タイムゾーンによる時差とは、現地時間と協定世界時(UTC、旧称はグリニッジ標準時)の時差(時間および分単位)です。 TIMESTAMP WITH TIME ZONE
と同様に、名前付きのタイムゾーンも使用できます。
次に構文を示します。
TIMESTAMP[(precision)] WITH LOCAL TIME ZONE
オプションのprecision
パラメータでは、秒のフィールドの小数部の桁数を指定します。 精度には0から9の範囲の整数リテラルを指定します。シンボリック定数や変数は指定できません。デフォルトは6です。
このデータ型は、TIMESTAMP
WITH
TIME
ZONE
とは異なり、データベース列に値を挿入すると、値はデータベースのタイムゾーンに正規化され、タイムゾーンによる時差は列に格納されません。 値を取り出すときには、ローカル・セッションのタイムゾーンで戻されます。
例3-7および例3-8では、いずれもTIMESTAMP
WITH
LOCAL
TIME
ZONE
型の変数を宣言して、その変数に値を代入します。 例3-7の値は適切な現地時間ですが、例3-8の値にはタイムゾーンによる時差が含まれているため、エラーが発生します。
INTERVAL
YEAR
TO
MONTH
データ型は、年および月の時間隔を格納し、操作するために使用します。 次に構文を示します。
INTERVAL YEAR[(precision)] TO MONTH
precision
では、年フィールドの桁数を指定します。 精度には0から4の範囲の整数リテラルを指定します。シンボリック定数や変数は指定できません。デフォルトは2です。
例3-9では、INTERVAL
YEAR
TO
MONTH
型の変数を宣言して、その変数に3つの方法で101年と3か月という値を代入しています。
例3-9 INTERVAL YEAR TO MONTH変数へのリテラルの代入
SQL> DECLARE 2 lifetime INTERVAL YEAR(3) TO MONTH; 3 BEGIN 4 lifetime := INTERVAL '101-3' YEAR TO MONTH; -- Interval literal 5 6 lifetime := '101-3'; -- Implicit conversion from character type 7 8 lifetime := INTERVAL '101' YEAR; -- Specify only years 9 lifetime := INTERVAL '3' MONTH; -- Specify only months 10 END; 11 / PL/SQL procedure successfully completed. SQL>
INTERVAL
DAY
TO
SECOND
データ型は、日、時間、分および秒の時間隔を格納し、操作するために使用します。 次に構文を示します。
INTERVAL DAY[(leading_precision) TO SECOND (fractional_seconds_precision)
leading_precision
およびfractional_seconds_precision
では、それぞれ日付フィールドと秒フィールドの桁数を指定します。 どちらの場合も、精度には0から9の範囲の整数リテラルを指定します。シンボリック定数や変数は指定できません。デフォルトはそれぞれ2および6です。
例3-10では、INTERVAL
DAY
TO
SECOND
型の変数を宣言して、その変数に値を代入します。
例3-10 INTERVAL DAY TO SECOND変数へのリテラルの代入
SQL> DECLARE 2 lag_time INTERVAL DAY(3) TO SECOND(3); 3 BEGIN 4 lag_time := '7 09:24:30'; 5 6 IF lag_time > INTERVAL '6' DAY THEN 7 DBMS_OUTPUT.PUT_LINE ('Greater than 6 days'); 8 ELSE 9 DBMS_OUTPUT.PUT_LINE ('Less than 6 days'); 10 END IF; 11 END; 12 / Greater than 6 days PL/SQL procedure successfully completed. SQL>
PL/SQLでは、日時式と時間隔式を作成できます。 この種の式に使用できる演算子を次のリストに示します。
オペランド1 | 演算子 | オペランド2 | 結果タイプ |
---|---|---|---|
日時 | + |
時間隔 | 日時 |
日時 | - |
時間隔 | 日時 |
時間隔 | + |
日時 | 日時 |
日時 | - |
日時 | 時間隔 |
時間隔 | + |
時間隔 | 時間隔 |
時間隔 | - |
時間隔 | 時間隔 |
時間隔 | * |
数値 | 時間隔 |
数値 | * |
時間隔 | 時間隔 |
時間隔 | / |
数値 | 時間隔 |
参照: SQLファンクションを使用して日時値の算術演算を実行する方法の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
日時の型のデフォルト精度は、最大精度より低い場合があります。 たとえば、DAY
TO
SECOND
のデフォルトはDAY(2)
TO
SECOND(6)
ですが、最大精度はDAY(9)
TO
SECOND(9)
です。 この種の型の変数を代入し、サブプログラムのパラメータを渡す場合に切捨てを防ぐためには、次のサブタイプの変数とサブプログラムのパラメータを宣言できます。各サブタイプでは、精度に最大値が使用されます。
TIMESTAMP_UNCONSTRAINED TIMESTAMP_TZ_UNCONSTRAINED TIMESTAMP_LTZ_UNCONSTRAINED YMINTERVAL_UNCONSTRAINED DSINTERVAL_UNCONSTRAINED
ラージ・オブジェクト(LOB)・データ型は、他のデータ項目とは別に格納されている大きいオブジェクト(テキスト、図形イメージ、ビデオ・クリップ、サウンド・ウェーブ形式など)を参照します。 LOBデータ型を使用すると、データに対して、効率的でランダムなピース単位のアクセスができます。 表3-9に、事前定義のPL/SQL LOBデータ型を示します。
表3-9 事前定義のPL/SQLのラージ・オブジェクト(LOB)・データ型
データ型 | 説明 | サイズ |
---|---|---|
|
データベース外のオペレーティング・システム・ファイルに大規模なバイナリ・オブジェクトを格納するために使用されます。 |
システムによって異なります。 4ギガバイト(GB)以下にする必要があります。 |
|
データベース内に大規模なバイナリ・オブジェクトを格納するために使用されます。 |
8から128テラバイト(TB) |
|
データベース内に文字データの大規模なブロックを格納するために使用されます。 |
8から128TB |
|
データベース内にNCHARデータの大規模なブロックを格納するために使用されます。 |
8から128TB |
LOBロケータ
外部ファイルに格納されている大きいオブジェクトを参照するために、LOBデータ型ではLOBロケータが使用されます。LOBロケータは、外部ファイルの行内部(インライン)または行外部(ライン外)のいずれかに格納されます。 外部ファイルでは、LOBロケータはBFILE
型、BLOB
型、CLOB
型およびNCLOB
型の列内に配置されます。
PL/SQLは、大きいオブジェクトに対する処理をそれぞれのオブジェクトのLOBロケータを介して行います。 たとえば、BLOB
列の値を選択した場合、PL/SQLはその値のロケータのみを戻します。 トランザクション中にPL/SQLがロケータを戻した場合、そのロケータにはトランザクションIDが含まれているため、別のトランザクションでそのロケータを使用してその大きいオブジェクトを更新することはできません。 同様にあるセッション中にあるロケータを保管してから、それを別のセッションで使用することもできません。
LOBデータ型とLONGおよびLONG RAWデータ型の相違点
LOBデータ型は、LONG
およびLONG
RAW
データ型とは次の点で異なっています。
相違点 | LOBデータ型 | LONGおよびLONG RAWデータ型 |
---|---|---|
サポート | 機能がリリースごとに拡張されます。 | 機能は変更されません。 既存のアプリケーションとの下位互換性のためにのみサポートされています。 |
最大サイズ | 8から128TB | 2GB |
アクセス | ランダム | 順次 |
使用可能なオブジェクト型属性 | BFILE 、BLOB 、CLOB : 使用可能NCLOB : 使用不可 |
使用不可 |
ここでのトピック:
BFILE
データ型は、データベース外のオペレーティング・システム・ファイルに大規模なバイナリ・オブジェクトを格納するために使用します。 どのBFILE
変数にも、サーバー上の大規模なバイナリ・ファイルを指すファイル・ロケータが格納されています。 ロケータには、フルパス名を指定するディレクトリ別名が含まれています。 論理パス名はサポートされていません。
BFILE
は読取り専用です。変更はできません。 指定されたBFILE
が存在し、Oracleにその読取り許可があることは、DBAによって保証されます。 基礎となるオペレーティング・システムがファイルの整合性を維持します。
BFILE
はトランザクションには関与せず、リカバリ可能ではなく、レプリケートできません。 オープンするBFILE
の最大数は、Oracle初期化パラメータSESSION_MAX_OPEN_FILES
に設定され、システムによって異なります。
BLOB
データ型は、データベース内の行内部または行外部に大規模なバイナリ・オブジェクトを格納するために使用します。 どのBLOB
変数にも、大規模なバイナリ・オブジェクトを指すロケータが格納されます。
BLOB
はトランザクションに完全に関与し、リカバリ可能で、レプリケートできます。 パッケージDBMS_LOB
によって行われた変更は、コミットまたはロールバックできます。 BLOB
ロケータは複数の(読取り専用)トランザクションにまたがることはできますが、複数のセッションにはまたがることができません。
CLOB
データ型は、データベース内の行内部または行外部に文字データの大規模なブロックを格納するために使用します。 固定幅と可変幅の、両方のキャラクタ・セットがサポートされています。 どのCLOB
変数にも、文字データの大規模なブロックを指すロケータが格納されます。
CLOB
はトランザクションに完全に関与し、リカバリ可能で、レプリケートできます。 パッケージDBMS_LOB
によって行われた変更は、コミットまたはロールバックできます。 CLOB
ロケータは複数の(読取り専用)トランザクションにまたがることはできますが、複数のセッションにはまたがることができません。
NCLOB
データ型は、データベース内の行内部または行外部にNCHAR
データの大規模なブロックを格納するために使用します。 固定幅と可変幅の、両方のキャラクタ・セットがサポートされています。 どのNCLOB
変数にも、NCHAR
データの大規模なブロックを指すロケータが格納されます。
NCLOB
はトランザクションに完全に関与し、リカバリ可能で、レプリケートできます。 パッケージDBMS_LOB
によって行われた変更は、コミットまたはロールバックできます。 NCLOB
ロケータは複数の(読取り専用)トランザクションにまたがることはできますが、複数のセッションにはまたがることができません。
サブタイプとは、別のデータ型のサブセットのことです。その別のデータ型は、そのサブタイプのベース型と呼ばれます。 サブタイプには、そのベース型で有効な演算と同じ演算が含まれています。ただし、ベース型の有効な値のサブセットのみが含まれています。 サブタイプを使用すると、信頼性が向上し、ANSI/ISO型との互換性が保たれ、さらに定数や変数の使用意図を示すことで読みやすさが向上します。
PL/SQLでは、パッケージSTANDARD
の中にいくつかのサブタイプが事前に定義されています。 たとえば、PL/SQLでは、サブタイプCHARACTER
およびINTEGER
が次のようにあらかじめ定義されています。
SUBTYPE CHARACTER IS CHAR; SUBTYPE INTEGER IS NUMBER(38,0); -- allows only whole numbers
サブタイプCHARACTER
は、そのベース型CHAR
と同じ値の集合を指定します。したがって、CHARACTER
は無制約サブタイプです。 ただし、サブタイプINTEGER
は、そのベース・タイプNUMBER
の値のサブセットのみを指定するため、INTEGER
は制約付きサブタイプです。
ここでのトピック:
ユーザー独自のサブタイプは、次の構文を使用して、任意のPL/SQLブロック、サブプログラムまたはパッケージの宣言部で定義できます。
SUBTYPE subtype_name IS base_type[(constraint)] [NOT NULL];
ここでsubtype_name
は後続の宣言で使用される型指定子です。base_type
は任意のスカラーまたはユーザー定義のPL/SQLデータ型で、constraint
は精度、およびスケールまたは最大サイズを指定できるベース型にのみ適用されます。 デフォルト値は許可されていません。例3-14を参照してください。
例
SQL> DECLARE 2 SUBTYPE BirthDate IS DATE NOT NULL; -- Based on DATE type 3 SUBTYPE Counter IS NATURAL; -- Based on NATURAL subtype 4 5 TYPE NameList IS TABLE OF VARCHAR2(10); 6 SUBTYPE DutyRoster IS NameList; -- Based on TABLE type 7 8 TYPE TimeRec IS RECORD (minutes INTEGER, hours INTEGER); 9 SUBTYPE FinishTime IS TimeRec; -- Based on RECORD type 10 SUBTYPE ID_Num IS employees.employee_id%TYPE; -- Based on column type 11 BEGIN 12 NULL; 13 END; 14 / PL/SQL procedure successfully completed. SQL>
%TYPE
または%ROWTYPE
を使用してベース型を指定できます。 %TYPE
がデータベース列のデータ型を提供する場合、サブタイプはその列のサイズ制約(存在する場合)を継承します。 サブタイプは、例3-15に示すとおり、NOT
NULL
、チェック制約、デフォルト値のような他の種類の列制約は継承しません。 詳細は、「%TYPE属性の使用」および「%ROWTYPE属性の使用」を参照してください。
サブタイプを定義すると、その型の項目を宣言できます。 サブタイプ名は、変数の使用意図を示します。 ユーザー定義のサブタイプに属する変数を宣言する場合に、そのサブタイプについて制約を設定できます。 次に例を示します。
SQL> DECLARE 2 SUBTYPE Counter IS NATURAL; 3 rows Counter; 4 5 SUBTYPE Accumulator IS NUMBER; 6 total Accumulator(7,2); 7 BEGIN 8 NULL; 9 END; 10 / PL/SQL procedure successfully completed. SQL>
サブタイプを使用すると、範囲外の値を検出でき、信頼性が向上します。 例3-11では、-9から9の範囲の整数を格納するようにサブタイプpinteger
を制限します。プログラムでこの範囲外の数値をpinteger
変数に格納しようとすると、PL/SQLによって例外が呼び出されます。
例3-11 サブタイプを使用した範囲の使用
SQL> DECLARE 2 v_sqlerrm VARCHAR2(64); 3 4 SUBTYPE pinteger IS PLS_INTEGER RANGE -9..9; 5 y_axis pinteger; 6 7 PROCEDURE p (x IN pinteger) IS 8 BEGIN 9 DBMS_OUTPUT.PUT_LINE (x); 10 END p; 11 12 BEGIN 13 y_axis := 9; 14 p(10); 15 16 EXCEPTION 17 WHEN OTHERS THEN 18 v_sqlerrm := SUBSTR(SQLERRM, 1, 64); 19 DBMS_OUTPUT.PUT_LINE('Error: ' || v_sqlerrm); 20 END; 21 / Error: ORA-06502: PL/SQL: numeric or value error PL/SQL procedure successfully completed. SQL>
ここでのトピック:
無制約のサブタイプは、そのベース型と互換性があります。 例3-12では、amount
の値を変換せずにtotal
に代入します。
例3-12 NUMBERデータ型のデータ型の互換性
SQL> DECLARE
2 SUBTYPE Accumulator IS NUMBER;
3 amount NUMBER(7,2);
4 total Accumulator;
5 BEGIN
6 amount := 10000.50;
7 total := amount;
8 END;
9 /
PL/SQL procedure successfully completed.
SQL>
異なるサブタイプでも、ベース型が同じならば互換性があります。
SQL> DECLARE 2 SUBTYPE b1 IS BOOLEAN; 3 SUBTYPE b2 IS BOOLEAN; 4 finished b1; 5 debugging b2; 6 BEGIN 7 finished := FALSE; 8 debugging := finished; 9 END; 10 / PL/SQL procedure successfully completed. SQL>
また、異なるサブタイプの場合、ベース型が同じデータ型の系列ならば互換性があります。 たとえば、verb
の値をsentence
に代入できます。
SQL> DECLARE 2 SUBTYPE Word IS CHAR(15); 3 SUBTYPE Text IS VARCHAR2(1500); 4 verb Word; 5 sentence Text(150); 6 BEGIN 7 verb := 'program'; 8 sentence := verb; 9 END; 10 / PL/SQL procedure successfully completed. SQL>
例3-13に、デフォルト値をサブタイプの変数に代入する例を示します。
例3-13 サブタイプの変数へのデフォルト値の代入
SQL> DECLARE 2 SUBTYPE v_word IS VARCHAR2(10) NOT NULL; 3 verb v_word := 'verb'; 4 noun v_word := 'noun'; 5 BEGIN 6 DBMS_OUTPUT.PUT_LINE (UPPER(verb)); 7 DBMS_OUTPUT.PUT_LINE (UPPER(noun)); 8 END; 9 / VERB NOUN PL/SQL procedure successfully completed. SQL>
例3-14では、プロシージャはNOT
NULL
制約を適用しますが、サイズ制約は適用しません。
例3-14 サブプログラムによるサブタイプ制約の継承
SQL> DECLARE 2 SUBTYPE v_word IS VARCHAR2(10) NOT NULL; 3 verb v_word := 'run'; 4 noun VARCHAR2(10) := NULL; 5 6 PROCEDURE word_to_upper (w IN v_word) IS 7 BEGIN 8 DBMS_OUTPUT.PUT_LINE (UPPER(w)); 9 END word_to_upper; 10 11 BEGIN 12 word_to_upper('more than ten characters'); 13 word_to_upper(noun); 14 END; 15 / MORE THAN TEN CHARACTERS DECLARE * ERROR at line 1: ORA-06502: PL/SQL: numeric or value error ORA-06512: at line 13 SQL>
サブタイプは、例3-15に示すとおり、列制約NOT
NULL
またはCHECK
は継承しませんが、列サイズ制約は継承します。
例3-15 サブタイプによる列制約の継承
SQL> CREATE TABLE employees_temp ( 2 empid NUMBER(6) NOT NULL PRIMARY KEY, 3 deptid NUMBER(6) CONSTRAINT c_employees_temp_deptid 4 CHECK (deptid BETWEEN 100 AND 200), 5 deptname VARCHAR2(30) DEFAULT 'Sales' 6 ); Table created. SQL> SQL> DECLARE 2 SUBTYPE v_empid_subtype IS employees_temp.empid%TYPE; 3 SUBTYPE v_deptid_subtype IS employees_temp.deptid%TYPE; 4 SUBTYPE v_deptname_subtype IS employees_temp.deptname%TYPE; 5 SUBTYPE v_emprec_subtype IS employees_temp%ROWTYPE; 6 7 v_empid v_empid_subtype; 8 v_deptid v_deptid_subtype; 9 v_deptname v_deptname_subtype; 10 v_emprec v_emprec_subtype; 11 BEGIN 12 v_empid := NULL; -- NULL constraint not inherited 13 v_deptid := 50; -- CHECK constraint not inherited 14 15 v_emprec.empid := NULL; -- NULL constraint not inherited 16 v_emprec.deptid := 50; -- CHECK constraint not inherited 17 18 DBMS_OUTPUT.PUT_LINE 19 ('v_deptname: ' || v_deptname); -- Default value not inherited 20 21 DBMS_OUTPUT.PUT_LINE 22 ('v_emprec.deptname: ' || v_emprec.deptname); 23 -- Default value not inherited 24 v_empid := 10000002; -- NUMBER(6) constraint inherited 25 END; 26 / v_deptname: v_emprec.deptname: DECLARE * ERROR at line 1: ORA-06502: PL/SQL: numeric or value error: number precision too large ORA-06512: at line 24 SQL>
あるデータ型の値を別のデータ型に変換することが必要な場合があります。 たとえばDATE
変数をレポートで使用するには、これを文字列に変換する必要があります。 PL/SQLでは、明示的な変換と暗黙的な変換がサポートされています。
信頼性とメンテナンス性を高めるために、明示的な変換を使用してください。 暗黙的変換は状況依存であるため、結果を常に予測できるとはかぎりません。また、将来のソフトウェア・リリースでこの変換の規則が変更される可能性があります。 さらに、暗黙的変換は、明示的な変換より低速となる可能性もあります。
ここでのトピック:
値のデータ型を別のデータ型に明示的に変換するには、組込みファンクションを使用します。組込みファンクションについては、『Oracle Database SQL言語リファレンス』を参照してください。 たとえば、CHAR
値をDATE
値またはNUMBER
値に変換するには、それぞれTO_DATE
ファンクションまたはTO_NUMBER
ファンクションを使用します。 逆に、DATE
値またはNUMBER
値をCHAR
値に変換するには、TO_CHAR
ファンクションを使用します。
明示的な変換を行うと、エラーまたは予期しない結果の発生を回避できます。 次に例を示します。
連結演算子(||)を使用して文字列と算術式を連結すると、エラーが発生する可能性があります。このエラーは、連結する前に、TO_CHAR
ファンクションを使用して算術式を文字列に変換することによって回避できます。
DATE
値の形式に関してデータベースでの言語設定に依存すると、予期しない結果が発生する可能性があります。これは、TO_CHAR
ファンクションを使用し、必要な形式を指定することによって回避できます。
PL/SQLによって、あるデータ型の値が別のデータ型に自動的に変換される場合があります。 これは暗黙的変換と呼ばれ、これらのデータ型は互換性があるといわれます。 2つのデータ型に互換性がある場合は、一方の型の値が期待されている場所で、もう一方の型の値を使用できます。 たとえば、通常は文字列を受け取るサブプログラムに数値リテラルを渡すことができます。サブプログラムは、数値の文字列表現を受け取ります。
例3-16では、CHAR
型変数であるstart_time
とfinish_time
に、午前0時からの秒数を表す文字列値が格納されています。 PL/SQLはCHAR
値をNUMBER
値に自動的に変換するため、これらの値の差をNUMBER
型変数のelapsed_time
に代入できます。
例3-16 暗黙的な変換
SQL> DECLARE 2 start_time CHAR(5); 3 finish_time CHAR(5); 4 elapsed_time NUMBER(5); 5 BEGIN 6 -- Get system time as seconds past midnight: 7 8 SELECT TO_CHAR(SYSDATE,'SSSSS') INTO start_time FROM sys.DUAL; 9 10 -- Processing done here 11 12 -- Get system time again: 13 14 SELECT TO_CHAR(SYSDATE,'SSSSS') INTO finish_time FROM sys.DUAL; 15 16 -- Compute and report elapsed time in seconds: 17 18 elapsed_time := finish_time - start_time; 19 DBMS_OUTPUT.PUT_LINE ('Elapsed time: ' || TO_CHAR(elapsed_time)); 20 END; 21 / Elapsed time: 0 PL/SQL procedure successfully completed. SQL>
あるデータ型の列から値を選択し、その値を別のデータ型の変数に代入すると、PL/SQLはその値をその変数のデータ型に変換します。 DATE
列の値を選択してVARCHAR2
変数に入れる場合がこれに該当します。
あるデータ型の変数の値を別のデータ型の列に代入すると、PL/SQLはその変数の値をその列のデータ型に変換します。
PL/SQLでは、どのような暗黙的変換が必要なのかが決定できない場合、コンパイル・エラーが発生します。 このような場合は、明示的な変換を使用する必要があります。
表3-10に、PL/SQLで実行できる暗黙的な変換を示します。ただし、次の点に注意してください。
表3-10は、異なる表現を持つデータ型のみを示しています。
PLS_INTEGER
とBINARY_INTEGER
、CLOB
とNCLOB
、CHAR
とNCHAR
、VARCHAR
とNVARCHAR2
などの同じ表現を持つ型は、相互に代用できます。
特定の値が実際に変換可能であるかどうかは、ユーザーが自分で確認する必要があります。
たとえば、PL/SQLはCHAR
値である'02-JUN-92'
をDATE
値に変換できますが、CHAR
値である'YESTERDAY'
をDATE
値に変換できません。 同様に、英字を含んでいるVARCHAR2
型の値はNUMBER
値に変換できません。
日付データ型、時刻データ型および時間隔データ型に関して
DATE
データ型の変換規則は、日時のデータ型にも適用されます。 ただし、これらの型は内部表現が異なるため、常に相互に変換できるとはかぎりません。 日時のデータ型間の暗黙的な変換の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
DATE
値をCHAR
値またはVARCHAR2
値に暗黙的に変換するために、PL/SQLは、文字列をデフォルトの日付書式で戻すファンクションTO_CHAR
を起動します。 時刻やユリウス日付などの情報を得るには、書式マスクを明示的に使用してTO_CHAR
を起動します。
CHAR
値またはVARCHAR2
値をDATE
列に挿入すると、PL/SQLは、パラメータがデフォルトの日付書式になっていることを期待するファンクションTO_DATE
を起動することによって、CHAR
値またはVARCHAR2
値をDATE
値に暗黙的に変換します。 他の書式の日付を挿入するには、書式マスクを明示的に使用してTO_DATE
を起動します。
LOBデータ型に関して
CLOB
値とNCLOB
値間の変換には、コストがかかる可能性があります。 この変換を意図的に実行するには、明示的な変換ファンクションTO_CLOB
およびTO_NCLOB
を使用します。
CLOB
値とCHAR
およびVARCHAR2
値間、BLOB
値とRAW
値間での暗黙的な変換によって、ほとんどのSQLおよびPL/SQLの文およびファンクションでLOBデータ型を使用できます。 ただし、LOB値に対して読取り、書込みおよびピース単位の操作を行うには、DBMS_LOB
パッケージ・サブプログラムを使用する必要があります。詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
RAW
およびLONG
RAW
データ型に関して
LONG
RAW
は、既存のアプリケーションとの下位互換性のためにのみ使用してください。 詳細は、「LONGおよびLONG RAWデータ型」を参照してください。
RAW
型またはLONG
RAW
型の列の値を選択してCHAR
型変数またはVARCHAR2
型変数に入れる場合、PL/SQLは内部バイナリ値を文字値に変換する必要があります。 PL/SQLは、RAW
型データまたはLONG
RAW
型データの各バイナリ・バイトを文字のペアとして戻すことによってこれを実行します。 個々の文字はニブル(半バイト)の16進値を表します。 たとえば、PL/SQLはバイナリ・バイト11111111を文字のペア'FF'
として戻します。 ファンクションRAWTOHEX
も同じ変換を実行します。
CHAR
型またはVARCHAR2
型の値をRAW
型またはLONG
RAW
型の列に挿入する場合にも変換が必要です。 変数内の文字のペアは、いずれもバイナリ・バイトの16進値を表している必要があります。そうでない場合は、PL/SQLによって例外が呼び出されます。
SQL文内にLONG
値がある場合、PL/SQLはLONG
値をVARCHAR2
値としてバインドします。 ただし、バインドされたVARCHAR2
の長さがVARCHAR2
列の最大幅(4000バイト)を超える場合は、バインド型がLONG
に自動的に変換され、エラー・メッセージが発行されます。これは、SQLファンクションにはLONG
値を渡すことができないためです。
表3-10 実行可能なPL/SQLの暗黙的なデータ型変換
変換前 | 変換後 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
BLOB |
CHAR |
CLOB |
DATE |
LONG |
NUMBER |
PLS_INTEGER |
RAW |
UROWID |
VARCHAR2 |
|
BLOB |
実行可能 |
|||||||||
CHAR |
実行可能 |
実行可能 |
実行可能 |
実行可能 |
実行可能 |
実行可能 |
実行可能 |
実行可能 |
||
CLOB |
実行可能 |
実行可能 |
||||||||
DATE |
実行可能 |
実行可能 |
実行可能 |
|||||||
LONG |
実行可能 |
実行可能 |
実行可能 |
|||||||
NUMBER |
実行可能 |
実行可能 |
実行可能 |
実行可能 |
||||||
PLS_INTEGER |
実行可能 |
実行可能 |
実行可能 |
実行可能 |
||||||
RAW |
実行可能 |
実行可能 |
実行可能 |
実行可能 |
||||||
UROWID |
実行可能 |
実行可能 |
||||||||
VARCHAR2 |
実行可能 |
実行可能 |
実行可能 |
実行可能 |
実行可能 |
実行可能 |
実行可能 |
実行可能 |