データ型
Oracle Databaseが処理する値は、それぞれデータ型を持ちます。値のデータ型により、固定された一連のプロパティが値に関連付けられます。このプロパティに応じて、Oracleは、あるデータ型の値を別のデータ型の値と区別して扱います。たとえば、NUMBER
データ型の値は加算できますが、RAW
データ型の値は加算できません。
表またはクラスタを作成する場合、各列にデータ型を指定する必要があります。プロシージャまたはストアド・ファンクションを作成する場合は、その各引数にデータ型を指定する必要があります。データ型によって、各列が含むことができる値のドメイン、または各引数が持つことができる値のドメインが決まります。たとえば、DATE
列は、2月29日(うるう年を除く)、2または'SHOE'という値を格納できません。列に入る値は、その列のデータ型を受け継ぎます。たとえば、DATE
列に'01-JAN-98'
を挿入すると、Oracleはそれが有効な日付に変換されることを確認してから、文字列'01-JAN-98'
をDATE
値として扱います。
Oracle Databaseには、多くの組込みデータ型、およびデータ型として使用できるいくつかのユーザー定義型のカテゴリがあります。Oracleのデータ型の構文については、次の構文図で示します。この項は、次の6つの項にわかれています。
データ型はスカラーまたは非スカラーです。スカラー型は、アトム値を持ちますが、非スカラー型(コレクションともいう)は一連の値を持ちます。ラージ・オブジェクト(LOB)は、スカラー型の特別な形で、バイナリまたは文字データのラージ・スカラー値を表しています。LOBはサイズが大きいため、他のスカラー型には影響しないいくつかの制限事項があります。これらの制限事項については、関連するSQL構文を参照してください。
関連項目:
Oracleプリコンパイラでは、埋込みSQLプログラム内の他のデータ型が認識されます。このようなデータ型は、外部データ型と呼ばれ、ホスト変数に対応付けられています。組込みデータ型およびユーザー定義型を外部データ型と混同しないでください。Oracleによる外部データ型と組込み型またはユーザー定義データ型の間の変換など、外部データ型の詳細は、『Pro*COBOLプログラマーズ・ガイド』および『Pro*C/C++プログラマーズ・ガイド』を参照してください。
datatypes::=
次の図に、Oracleの組込みデータ型について示します。詳細は、Oracleの組込みデータ型を参照してください。
Oracle_built_in_datatypes::=
character_datatypes::=
number_datatypes::=
long_and_raw_datatypes::=
datetime_datatypes::=
large_object_datatypes::=
rowid_datatypes::=
次に、ANSIがサポートしているデータ型について示します。また、ANSI、DB2、SQL/DSのデータ型に、ANSIがサポートしているデータ型をOracle組込みデータ型にマップする方法を示します。
ANSI_supported_datatypes::=
ユーザー定義型の詳細は、ユーザー定義型を参照してください。
次の図に、Oracleが提供するデータ型について示します。詳細は、Oracleが提供する型を参照してください。
Oracle_supplied_types::=
any_types::=
任意
型の詳細は、任意型を参照してください。
XML_types::=
XML型の詳細は、XML型を参照してください。
spatial_types::=
Spatial型の詳細は、Spatial型を参照してください。
media_types::=
still_image_object_types::=
メディア型の詳細は、メディア型を参照してください。
Oracleの組込みデータ型
組込みデータ型の概要表には、使用可能な組込みデータ型がリストされています。Oracle Databaseでは、データ型を内部的に識別するためにコードが使用されます。これは、組込みデータ型の概要表の「コード」列の数字です。表のコードは、DUMP
関数を使用して検証できます。
組込みデータ型の概要表に示されている組込みデータ型に加えて、Oracle Databaseでは、DUMP
ファンクションによって表示される多くのデータ型が内部的に使用されます。
表2-1 組込みデータ型の概要
コード | データ型 | 説明 |
---|---|---|
1 |
|
最大長が
|
1 |
|
最大長が
|
2 |
|
精度 |
2 |
|
精度 |
8 |
|
最大2GB(231から1を引いたバイト数)の可変長文字データ。下位互換性を維持するために提供されています。 |
12 |
|
紀元前4712年1月1日から紀元9999年12月31日までの日付を指定します。デフォルトの書式は、 |
100 |
|
32ビットの浮動小数点数。このデータ型には4バイトが必要です。 |
101 |
|
64ビットの浮動小数点数。このデータ型には8バイトが必要です。 |
180 |
|
日付の年、月、日および時刻の時、分、秒の値。 |
181 |
|
タイムゾーンによる時差などのすべての |
231 |
|
デフォルトの書式は、 |
182 |
|
年および月で期間を格納。 |
183 |
|
日、時、分および秒で期間を格納。
サイズは11バイトに固定されています。 |
23 |
|
長さ
|
24 |
|
最大2GBの可変長バイナリ・データ。 |
69 |
|
表の行のアドレスを一意に表すBASE64文字列。主に、 |
208 |
|
索引構成表の行の論理アドレスを表すBASE64文字列。オプションの |
96 |
|
長さ
|
96 |
|
長さ |
112 |
|
シングルバイト文字またはマルチバイト・キャラクタを含むキャラクタ・ラージ・オブジェクト。固定幅および可変幅の文字セットがサポートされ、両方ともデータベース文字セットで使用されます。最大サイズは、4GBから1を引いたバイト数にデータベース・ブロック・サイズを掛けた値です。 |
112 |
|
Unicodeキャラクタを含むキャラクタ・ラージ・オブジェクト。固定幅および可変幅の文字セットがサポートされます。両方の文字セットでデータベースの各国語文字セットを使用します。最大サイズは、4GBから1を引いたバイト数にデータベース・ブロック・サイズを掛けた値です。各国語文字セット・データが格納されます。 |
113 |
|
バイナリ・ラージ・オブジェクト。最大サイズは、4GBから1を引いたバイト数にデータベース・ブロック・サイズを掛けた値です。 |
114 |
|
データベース外に保存された大きなバイナリ・ファイルへロケータを格納。データベース・サーバー上に存在する外部LOBへのバイト・ストリームI/Oアクセスを可能にします。最大サイズは4GBです。 |
次の項では、Oracle Databaseに格納されるOracleデータ型について説明します。これらのデータ型をリテラルとして指定する方法については、リテラルを参照してください。
文字データ型
文字データ型を使用すると、単語や自由形式のテキストなど、データベース文字セットまたは各国語文字セットの文字(英数字)を格納できます。文字データ型は、他のデータ型より制限が少ないため、プロパティも少なくなります。たとえば、文字データ型の列は、すべての英数字の値を格納できますが、NUMBER
型の列が格納できるのは数値のみです。
文字データは、7ビットASCIIやEBCDICなど、データベース作成時に指定された文字セットの1つに対応しているバイト値で文字列に格納されます。Oracle Databaseは、シングルバイトの文字セットとマルチバイトの文字セットの両方をサポートします。
次のデータ型が、文字データに対して使用されます。
文字データ型をリテラルとして指定する方法については、テキスト・リテラルを参照してください。
CHARデータ型
CHAR
データ型は、データベース文字セットの固定長の文字列を指定します。データベースの作成時には、データベース文字セットを指定します。
CHAR
の列を含む表の作成時には、size
として列長を指定し、その後にオプションで長さの修飾子を指定します。修飾子BYTE
はバイト長セマンティクスを表し、修飾子CHAR
は文字長セマンティクスを表します。バイト長セマンティクスでは、size
は列に格納するバイト数です。文字長セマンティクスでは、size
は列に格納するデータベース文字セットのコード・ポイント数です。コード・ポイントは、データベース文字セットおよびコード・ポイントによってエンコードされた特定の文字に応じて1から4バイトです。いずれかの長さ修飾子を指定して、列の目的の長さセマンティクスを明示的に指定することをお薦めします。修飾子を指定しない場合は、列を作成しているセッションのNLS_LENGTH_SEMANTICS
パラメータの値によって長さセマンティクスが定義されますが、デフォルト・セマンティクスがBYTE
であるスキーマSYS
に表が属している場合を除きます。
Oracleでは、CHAR
列に格納されているすべての値は、選択した長さセマンティクスのsize
によって指定された長さになります。列の長さより短い値を挿入すると、列の長さにあわせるため、その値の後に空白が埋め込まれます。列に対して長すぎる値を挿入しようとすると、Oracleはエラーを戻します。列長が文字(コード・ポイント)で表現されている場合、空白埋めでは、すべての列値が同じバイト長であることは保証されません。
size
は列定義から省略できます。デフォルト値は1です。
size
の最大値は2000で、選択した長さセマンティクスに応じて2000バイトまたは文字(コード・ポイント)を意味します。ただし、これとは関係なく、CHAR
列に格納できる文字値の絶対最大長は2000バイトです。たとえば、列長を2000文字に定義した場合でも、1つ以上のコード・ポイントの幅が1バイトより大きい2000文字の値を挿入しようとすると、エラーが戻されます。文字のsize
の値は長さの制約であり、容量を保証するものではありません。CHAR
列に常にデータベース文字セットのsize
文字を格納できるようにするには、500以下のsize
の値を使用します。
異なる文字セットを持つデータベースおよびクライアント間で適切にデータを変換するには、CHAR
データが正しい書式の文字列で構成されていることを確認してください。
関連項目:
文字セット・サポートの詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。比較セマンティクスについては、データ型の比較規則を参照してください。
NCHARデータ型
NCHAR
データ型は、各国語文字セットの固定長の文字列を指定します。データベースの作成時に、各国語文字セットをAL16UTF16またはUTF8として指定します。AL16UTF16およびUTF8は、Unicode文字セットの2つのエンコード方式(それぞれUTF-16およびCESU-8)であるため、NCHAR
はUnicodeのみのデータ型です。
NCHAR
列を使用して表を作成するときは、列長をsize
文字として指定するか、より正確に各国語文字セットのコード・ポイントとして指定します。1つのコード・ポイントは、コード・ポイントによってエンコードされた特定の文字に応じて、AL16UTF16では常に2バイト、UTF8では1から3バイトです。
Oracleでは、NCHAR
列に格納されているすべての値は、size
文字の長さになります。列の長さより短い値を挿入すると、列の長さにあわせるため、その値の後に空白が埋め込まれます。列に対して長すぎる値を挿入しようとすると、Oracleはエラーを戻します。各国語文字セットがUTF8の場合、空白埋めでは、すべての列値が同じバイト長であることは保証されません。
size
は列定義から省略できます。デフォルト値は1です。
size
の最大値は、各国語文字セットがAL16UTF16の場合は1000文字、UTF8の場合は2000文字です。ただし、これとは関係なく、NCHAR
列に格納できる文字値の絶対最大長は2000バイトです。たとえば、列長を1000文字に定義した場合でも、各国語文字セットがUTF8ですべてのコード・ポイントが3バイト幅のときに1000文字の値を挿入しようとすると、エラーが戻されます。size
の値は長さの制約であり、容量を保証するものではありません。NCHAR
列に常に両方の各国語文字セットのsize
文字を格納できるようにするには、666以下のsize
の値を使用します。
異なる文字セットを持つデータベースおよびクライアント間で適切にデータを変換するには、NCHAR
データが正しい書式の文字列で構成されていることを確認してください。
CHAR
値をNCHAR
列に割り当てる場合、値はデータベース文字セットから各国語文字セットに暗黙的に変換されます。NCHAR
値をCHAR
列に割り当てる場合、値は各国語文字セットからデータベース文字セットに暗黙的に変換されます。NCHAR
値の文字の一部をデータベース文字セットで表現できない場合、セッション・パラメータNLS_NCHAR_CONV_EXCP
の値がTRUE
のときは、エラーが戻されます。パラメータの値がFALSE
の場合は、表現できない文字はデータベース文字セットのデフォルトの置換文字(通常は疑問符?または逆疑問符¿)に置き換えられます。
関連項目:
Unicodeデータ型のサポートについては、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください
VARCHAR2データ型
VARCHAR2
データ型は、データベース文字セットの可変長の文字列を指定します。データベースの作成時には、データベース文字セットを指定します。
VARCHAR2
の列を含む表の作成時には、size
として列長を指定し、その後にオプションで長さの修飾子を指定する必要があります。修飾子BYTE
はバイト長セマンティクスを表し、修飾子CHAR
は文字長セマンティクスを表します。バイト長セマンティクスでは、size
は列に格納できる最大バイト数です。文字長セマンティクスでは、size
は列に格納できるデータベース文字セットの最大コード・ポイント数です。コード・ポイントは、データベース文字セットおよびコード・ポイントによってエンコードされた特定の文字に応じて1から4バイトです。いずれかの長さ修飾子を指定して、列の目的の長さセマンティクスを明示的に指定することをお薦めします。修飾子を指定しない場合は、列を作成しているセッションのNLS_LENGTH_SEMANTICS
パラメータの値によって長さセマンティクスが定義されますが、デフォルト・セマンティクスがBYTE
であるスキーマSYS
に表が属している場合を除きます。
文字値は、列の長さを超えない場合、空白埋めなしに、指定したとおりにVARCHAR2
列に格納されます。最大長を超える値を挿入しようとすると、Oracleはエラーを戻します。
size
の最小値は1です。最大値は次のとおりです。
-
32767バイト(
MAX_STRING_SIZE
=
EXTENDED
の場合) -
4000バイト(
MAX_STRING_SIZE
=
STANDARD
の場合)
MAX_STRING_SIZE
初期化パラメータと拡張データ型の内部記憶域メカニズムの詳細は、拡張データ型を参照してください。
size
はバイトまたは文字(コード・ポイント)で表現できますが、VARCHAR2
列に格納できる文字値の独立した絶対最大長は、MAX_STRING_SIZE
に応じて32767または4000バイトです。たとえば、列長を32767文字に定義した場合でも、1つ以上のコード・ポイントの幅が1バイトより大きい32767文字の値を挿入しようとすると、エラーが戻されます。文字のsize
の値は長さの制約であり、容量を保証するものではありません。VARCHAR2
列に常にデータベース文字セットのsize
文字を格納できるようにするには、MAX_STRING_SIZE
=
EXTENDED
の場合は8191以下、MAX_STRING_SIZE
=
STANDARD
の場合は1000以下のsize
の値を使用します。
Oracleは、非空白埋め比較セマンティクスを使用してVARCHAR2
値を比較します。
異なる文字セットを持つデータベース間で適切にデータを変換するには、VARCHAR2
データが正しい書式の文字列で構成されていることを確認してください。文字セット・サポートの詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。
関連項目:
比較セマンティクスについては、データ型の比較規則を参照してください。
VARCHARデータ型
VARCHAR
データ型は、使用しないでください。かわりにVARCHAR2
データ型を使用してください。現在、VARCHAR
データ型はVARCHAR2
データ型と同じ意味で使用されていますが、VARCHAR
データ型は、異なる比較セマンティクスで比較される別の可変長文字列のデータ型に変更される予定です。
NVARCHAR2データ型
NVARCHAR2
データ型は、各国語文字セットの可変長文字列を指定します。データベースの作成時に、各国語文字セットをAL16UTF16またはUTF8として指定します。AL16UTF16およびUTF8は、Unicode文字セットの2つのエンコード方式(それぞれUTF-16およびCESU-8)であるため、NVARCHAR2
はUnicodeのみのデータ型です。
NVARCHAR2
列を使用して表を作成するときは、列長をsize
文字として指定するか、より正確に各国語文字セットのコード・ポイントとして指定する必要があります。1つのコード・ポイントは、コード・ポイントによってエンコードされた特定の文字に応じて、AL16UTF16では常に2バイト、UTF8では1から3バイトです。
文字値は、列の長さを超えない場合、空白埋めなしに、指定したとおりにNVARCHAR2
の列に格納されます。最大長を超える値を挿入しようとすると、Oracleはエラーを戻します。
size
の最小値は1です。最大値は次のとおりです。
-
MAX_STRING_SIZE
=
EXTENDED
で各国語文字セットがAL16UTF16の場合は16383 -
MAX_STRING_SIZE
=
EXTENDED
で各国語文字セットがUTF8の場合は32767 -
MAX_STRING_SIZE
=
STANDARD
で各国語文字セットがAL16UTF16の場合は2000 -
MAX_STRING_SIZE
=
STANDARD
で各国語文字セットがUTF8の場合は4000
MAX_STRING_SIZE
初期化パラメータと拡張データ型の内部記憶域メカニズムの詳細は、拡張データ型を参照してください。
文字の最大列長とは関係なく、NVARCHAR2
列に格納できる値の絶対最大長は、MAX_STRING_SIZE
に応じて32767または4000バイトです。たとえば、列長を16383文字に定義した場合でも、各国語文字セットがUTF8ですべてのコード・ポイントが3バイト幅のときに16383文字の値を挿入しようとすると、エラーが戻されます。size
の値は長さの制約であり、容量を保証するものではありません。NVARCHAR2
列に常に両方の各国語文字セットのsize
文字を格納できるようにするには、MAX_STRING_SIZE
=
EXTENDED
の場合は10922以下、MAX_STRING_SIZE
=
STANDARD
の場合は1333以下のsize
の値を使用します。
Oracleは、非空白埋め比較セマンティクスを使用してNVARCHAR2
値を比較します。
異なる文字セットを持つデータベースおよびクライアント間で適切にデータを変換するには、NVARCHAR2
データが正しい書式の文字列で構成されていることを確認してください。
VARCHAR2
値をNVARCHAR2
列に割り当てる場合、値はデータベース文字セットから各国語文字セットに暗黙的に変換されます。NVARCHAR2
値をVARCHAR2
列に割り当てる場合、値は各国語文字セットからデータベース文字セットに暗黙的に変換されます。NVARCHAR2
値の文字の一部をデータベース文字セットで表現できない場合、セッション・パラメータNLS_NCHAR_CONV_EXCP
の値がTRUE
のときは、エラーが戻されます。パラメータの値がFALSE
の場合は、表現できない文字はデータベース文字セットのデフォルトの置換文字(通常は疑問符?または逆疑問符¿)に置き換えられます。
関連項目:
Unicodeデータ型のサポートについては、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。
数値データ型
Oracle Databaseの数値データ型は、正と負の固定小数点数と浮動小数点数、0(ゼロ)、無限大、および操作の未定義の結果である値(非数値、つまりNAN
)を格納します。数値データ型をリテラルとして指定する方法については、数値リテラルを参照してください。
NUMBERデータ型
NUMBER
データ型は、0(ゼロ)と、絶対値が1.0×10-130以上1.0×10126未満の範囲にある正と負の固定小数点数を格納します。1.0×10126以上の絶対値を持つ算術式を指定した場合、Oracleはエラーを戻します。NUMBER
の各値は1から22バイトである必要があります。
次の書式で固定小数点数を指定できます。
NUMBER(p,s)
説明:
-
p
は精度(precision)、つまり最大有効桁数(10進)です。最上位有効桁は最も左側のゼロ以外の桁で、最下位有効桁は最も右側の桁です。Oracleは、100進数で20桁までの精度で数値の移植性を保証します。これは小数点の位置によって39桁(10進)または40桁(10進)になります。 -
s
は位取り(scale)、つまり小数点から最下位有効桁までの桁数です。位取りの有効範囲は-84から127です。-
位取りが正の場合は、小数点の右側にある桁数で最下位有効桁を含んだ桁数になります。
-
位取りが負の場合、小数点の左側にある桁数です。この場合は最下位有効桁を含みません。位取りが負の場合、実際のデータは整数部分の右から指定された桁数のみ丸められるため、最下位有効桁は小数点の左側になります。たとえば、(10,-2)と指定すると100の位まで丸められます。
-
e
表記を使用する場合、位取りは通常、精度よりも大きくなります。位取りが精度より大きい場合、精度は小数点の右側にある最大有効桁数を示します。たとえば、NUMBER(4,5)
として定義された列は、小数点の後の最初の桁が0(ゼロ)である必要があり、小数点以下5桁を超える値はすべて丸められます。
入力に対する特別な整合性チェックとして、固定小数点数列の位取りと精度を指定することをお薦めします。位取りと精度を指定しても、すべての値が固定長に強制されるわけではありません。値が精度の有効範囲を超えると、Oracleはエラーを戻します。値が位取りの有効範囲を超えると、Oracleはその値を丸めます。
次の書式で整数を指定できます。
NUMBER(p)
これは、精度がp
で、位取りが0の固定小数点数です(NUMBER(p,0)
と同じです)。
次の書式で浮動小数点を指定できます。
NUMBER
精度および位取りを指定しない場合、最大の範囲および精度をOracleの数値に指定したことになります。
関連項目:
表2-2に、異なる精度および位取りを使用したOracleのデータの格納方法を示します。
表2-2 精度および位取りの格納
実際のデータ | 指定する精度と位取り | 格納されるデータ |
---|---|---|
123.89 |
|
123.89 |
123.89 |
|
124 |
123.89 |
|
精度を超える |
123.89 |
|
精度を超える |
123.89 |
|
123.89 |
123.89 |
|
123.9 |
123.89 |
|
100 |
.01234 |
|
.01234 |
.00012 |
|
.00012 |
.000127 |
|
.00013 |
.0000012 |
|
.0000012 |
.00000123 |
|
.0000012 |
1.2e-4 |
|
0.00012 |
1.2e-5 |
|
0.00001 |
FLOATデータ型
FLOAT
データ型は、NUMBER
のサブタイプです。このデータ型は、精度とともに指定するか、または精度なしで指定でき、その定義はNUMBER
の場合と同じであり、1から126の範囲で指定します。位取りは指定できませんが、データから解釈されます。FLOAT
の各値は1から22バイトである必要があります。
2進精度から10進精度に変換するには、n
に0.30103を乗算します。10進精度から2進精度に変換するには、10進精度に3.32193を乗算します。2進精度の126桁は、10進精度の38桁とほぼ等しくなります。
NUMBER
とFLOAT
の違いは、例を使用して説明します。次の例では、同じ値がNUMBER
列とFLOAT
列に挿入されます。
CREATE TABLE test (col1 NUMBER(5,2), col2 FLOAT(5)); INSERT INTO test VALUES (1.23, 1.23); INSERT INTO test VALUES (7.89, 7.89); INSERT INTO test VALUES (12.79, 12.79); INSERT INTO test VALUES (123.45, 123.45); SELECT * FROM test; COL1 COL2 ---------- ---------- 1.23 1.2 7.89 7.9 12.79 13 123.45 120
この例では、戻されるFLOAT
の値は、5桁(2進)を超えることはできません。5桁(2進)で表すことができる10進数の最大値は31です。最後の行には、31を超える10進値が含まれています。このため、FLOAT
の値は、その有効桁数が5桁(2進)を超えないように切り捨てられる必要があります。したがって、123.45は、2桁の有効桁数(10進)のみを持ち、4桁(2進)しか必要のない120に丸められます。
ANSIのFLOAT
データを変換する際、Oracle Databaseは、OracleのFLOAT
データ型を内部的に使用します。OracleのFLOAT
は使用可能ですが、BINARY_FLOAT
およびBINARY_DOUBLE
データ型の方がより堅牢であるため、これらのデータ型を使用することをお薦めします。詳細は、浮動小数点数を参照してください。
浮動小数点数
浮動小数点数は、最初の桁から最後の桁までの任意の位置に小数点を置くことも、小数点を省略することもできます。指数は、数字の後に増加する桁数を表すときに、オプションで使用されます(たとえば、1.777 e-20)。小数点以下の桁数に制限はないため、浮動小数点数に対して位取りは指定できません。
2進浮動小数点数とNUMBER
では、Oracle Databaseによる内部的な値の格納方法が異なります。NUMBER
の場合、値は10進精度を使用して格納されます。NUMBER
でサポートされる範囲内および精度内のすべてのリテラルは、NUMBER
として正確に格納されます。これは、リテラルが10進精度(0から9)を使用して表されるためです。2進浮動小数点数は、2進精度(0および1)を使用して格納されます。このような格納スキームでは、10進精度を使用したすべての値を正確に表すことができません。値を10進精度から2進精度に変換するときに発生するエラーは、その値を2進精度から10進精度に戻すときには発生しない場合が多くあります。リテラル0.1はその一例です。
Oracle Databaseでは、浮動小数点数専用の2種類の数値データ型を提供しています。
BINARY_DOUBLE
BINARY_DOUBLE
は、64ビットの倍精度浮動小数点数データ型です。各BINARY_DOUBLE
の値には8バイトが必要です。
NUMBER
列では、浮動小数点数は10進精度を持ちます。BINARY_FLOAT
列またはBINARY_DOUBLE
列では、浮動小数点数は2進精度を持ちます。2進浮動小数点数では、特殊な値である無限大およびNaN
(非数値)がサポートされます。
表2-3に示す制限内で、浮動小数点数を指定できます。浮動小数点数を指定する書式については、数値リテラルを参照してください。
表2-3 浮動小数点数の制限
値 | BINARY_FLOAT | BINARY_DOUBLE |
---|---|---|
正の最大有限値 |
3.40282E+38F |
1.79769313486231E+308 |
正の最小有限値 |
1.17549E-38F |
2.22507485850720E-308 |
IEEE754への規格準拠
Oracleの浮動小数点データ型の実装は、2進浮動小数点算術の規格である電気電子学会(IEEE) 754-1985 (IEEE754)規格に準拠しています。浮動小数点データ型は次の点でIEEE754に準拠しています。
-
SQLファンクション
SQRT
は平方根を実装します。「SQRT」を参照してください。 -
SQLファンクション
REMAINDER
は余りを実装します。「REMAINDER」を参照してください。 -
算術演算子が準拠しています。「算術演算子」を参照してください。
-
比較演算子が準拠しています。ただし、
NaN
と比較する場合は除きます。Oracleは、NaN
が他のすべての値より大きいとみなし、NaN
とNaN
は等しいと評価します。「浮動小数点条件」を参照してください。 -
変換演算子が準拠しています。「変換ファンクション」を参照してください。
-
デフォルトの丸めモードがサポートされています。
-
デフォルトの例外処理モードがサポートされています。
-
特殊な値である
INF
、-INF
およびNaN
がサポートされています。「浮動小数点条件」を参照してください。 -
BINARY_FLOAT
およびBINARY_DOUBLE
の値を整数値のBINARY_FLOAT
およびBINARY_DOUBLE
に丸める方法として、SQLファンクションROUND
、TRUNC
、CEIL
およびFLOOR
が提供されています。 -
BINARY_FLOAT
およびBINARY_DOUBLE
を10進値に、10進値をBINARY_FLOAT
およびBINARY_DOUBLE
に丸める方法として、SQLファンクションTO_CHAR
、TO_NUMBER
、TO_NCHAR
、TO_BINARY_FLOAT
、TO_BINARY_DOUBLE
およびCAST
が提供されています。
浮動小数点データ型は次の点ではIEEE754に準拠していません。
-
-0は+0に強制変換されます。
-
NaN
との比較はサポートされていません。 -
すべての
NaN
値は、BINARY_FLOAT_NAN
またはBINARY_DOUBLE_NAN
のいずれかに強制変換されます。 -
デフォルト以外の丸めモードはサポートされていません。
-
デフォルト以外の例外処理モードはサポートされていません。
数値の優先順位
数値データ型をサポートする操作で、操作の引数が様々なデータ型を持つ場合、Oracleが使用するデータ型は、数値の優先順位によって判断されます。数値の優先順位が最も高いデータ型はBINARY_DOUBLE
であり、その次がBINARY_FLOAT
、最後がNUMBER
となります。したがって、複数の数値に対する操作では、次のようになります。
-
オペランドのいずれかが
BINARY_DOUBLE
の場合、Oracleは操作の実行前に、すべてのオペランドを暗黙的にBINARY_DOUBLE
に変換しようとします。 -
オペランドに
BINARY_DOUBLE
はないが、いずれかがBINARY_FLOAT
の場合、Oracleは操作の実行前に、すべてのオペランドを暗黙的にBINARY_FLOAT
に変換しようとします。 -
それ以外の場合は、Oracleは操作の実行前に、すべてのオペランドを
NUMBER
に変換しようとします。
暗黙的な変換が必要な場合に変換に失敗すると、操作は実行されません。暗黙的な変換の詳細は、表2-8を参照してください。
他のデータ型のコンテキストでは、数値データ型の優先順位は、日時データ型と期間データ型よりも低く、文字データ型とその他のすべてのデータ型よりも高くなります。
LONGデータ型
LONG
列を使用した表を作成しないでください。かわりに、LOB列(CLOB
、NCLOB
またはBLOB
)を使用してください。LONG
列は、下位互換性のためにサポートされています。
LONG
列には、2GB(231)から1を引いたバイト数までの可変長の文字列を格納できます。LONG
列には、多くの点でVARCHAR2
列と同じ特長があります。LONG
列を使用すると、長いテキスト文字列を格納できます。LONG
値の長さは、ご使用のコンピュータで利用できるメモリーによって制限される場合もあります。LONG
リテラルは、テキスト・リテラルの説明のような形式になります。
既存のLONG
列もLOB列に変換することをお薦めします。LOB列は、LONG
列ほど制限は多くありません。LOB機能はリリースごとに拡張されていますが、LONG
機能は最近のリリースでは変更されていません。LONG
列からLOB列への変換については、「ALTER TABLE」のmodify_col_properties
句および「TO_LOB」を参照してください。
-
SELECT
リスト -
UPDATE
文のSET
句 -
INSERT
文のVALUES
句
-
表には複数の
LONG
列を含めることはできません。 -
LONG
属性を持つオブジェクトは作成できません。 -
LONG
列は、WHERE
句または整合性制約では指定できません(NULL
およびNOT
NULL
制約は除く)。 -
LONG
列に索引を付けることはできません。 -
LONG
データは正規表現では指定できません。 -
ストアド・ファンクションは
LONG
値を戻すことはできません。 -
LONG
データ型を使用して、PL/SQLプログラム・ユニットの変数または引数を宣言できます。ただし、そのプログラム・ユニットは、SQLからコールできません。 -
単一のSQL文に指定する、すべての
LONG
列、更新された表、ロックされた表は、同一データベース上にある必要があります。 -
LONG
列およびLONG
RAW
列は、分散型のSQL文で使用できません。また、レプリケートできません。 -
LONG
とLOBの両方の列を持つ表では、1つのSQL文でLONG
とLOB列の両方に4000バイトより大きいデータをバインドすることはできません。ただし、LONG
列またはLOB列のいずれか一方には、4,000バイトを超えるデータをバインドできます。
また、LONG
列はSQL文の次のような部分では使用できません。
-
GROUP
BY
句、ORDER
BY
句、CONNECT
BY
句またはSELECT
文にあるDISTINCT
演算子 -
SELECT
文のUNIQUE
演算子 -
CREATE
CLUSTER
文の列リスト -
CREATE
MATERIALIZED
VIEW
文のCLUSTER
句 -
SQL組込みファンクション、式または条件
-
GROUP
BY
句を含む問合せのSELECT
構文のリスト -
UNION
、INTERSECT
またはMINUS
集合演算子によって結合されている副問合せまたは問合せのSELECT
構文のリスト -
CREATE
TABLE
...AS
SELECT
文のSELECT
構文のリスト -
ALTER
TABLE
...MOVE
文 -
INSERT
文の副問合せのSELECT
構文のリスト
-
トリガー内のSQL文で、データを
LONG
列に挿入できます。 -
LONG
列のデータをCHAR
やVARCHAR2
などの制約があるデータ型に変換できる場合は、トリガー内のSQL文でLONG
列を参照できます。 -
トリガー内の変数は、
LONG
データ型を使用して宣言できません。 -
:
NEW
と:OLD
はLONG
列で使用できません。
Oracle Call Interfaceを使用して、データベースからLONG
値の一部を検索できます。
日時および間隔のデータ型
日時データ型には、DATE
、TIMESTAMP
、TIMESTAMP
WITH
TIME
ZONE
およびTIMESTAMP
WITH
LOCAL
TIME
ZONE
があります。日時データ型の値は、「日時」とも呼ばれます。期間データ型には、INTERVAL
YEAR
TO
MONTH
およびINTERVAL
DAY
TO
SECOND
があります。期間データ型の値は、「期間」とも呼ばれます。日時値と期間値をリテラルとして表す方法の詳細は、日時リテラルおよび期間リテラルを参照してください。
DatatimesとIntervalsは、どちらも複数のフィールドで構成されます。これらのフィールドの値は、データ型の値によって決まります。表2-4に、日時フィールド、および日時と期間の有効な値を示します。
日時データのDML操作で正しい結果を得るには、組込みSQLファンクションDBTIMEZONE
およびSESSIONTIMEZONE
で問い合せることによって、データベースおよびセッションのタイムゾーンを確認します。タイムゾーンを手動で設定していない場合、Oracle Databaseは、オペレーティング・システムのタイムゾーンをデフォルトで使用します。オペレーティング・システムのタイムゾーンがOracleで有効でない場合は、Oracleは、協定世界時(UTC)(以前のグリニッジ標準時)をデフォルトの値として使用します。
表2-4 日時フィールド、および日時と期間の値
日時フィールド | 日時に有効な値 | 期間に有効な値 |
---|---|---|
|
-4712から9999 (0を除きます) |
正または負のすべての整数 |
|
01から12 |
0から11 |
|
01から31(現在のNLSカレンダ・パラメータに従った |
正または負のすべての整数 |
|
00から23 |
0から23 |
|
00から59 |
0から59 |
|
00から59.9(n)(「9(n)」は秒の小数部の精度。) |
00から59.9(n)(「9(n)」は秒の小数部の期間の精度) |
|
-12から14(この範囲は夏時間の変更を保存します。) |
該当なし |
(表の後のノートを参照) |
00から59。 |
該当なし |
|
|
該当なし |
|
|
該当なし |
ノート:
TIMEZONE_HOUR
およびTIMEZONE_MINUTE
は同時に指定され、+
|-
hh
:
mi
の形式(-12:59から+14:00までの値を使用)で1つのエンティティとして解釈されます。APIにタイムゾーン値を指定する方法の詳細は、『Oracle Data Provider for .NET開発者ガイドfor Microsoft Windows』を参照してください。
DATEデータ型
DATE
データ型は、日付および時刻の情報を格納するために使用します。日付および時刻の情報は、文字データ型および数値データ型で表現できますが、DATE
データ型には特別に対応付けられているプロパティがあります。各DATE
値には、年、月、日、時、分および秒の情報が格納されます。
DATE
値をリテラルに指定するか、文字値や数値をTO_DATE
ファンクションによって日付値に変換できます。これらの方法でのDATE
値の表し方の例は、日時リテラルを参照してください。
ユリウス日の使用方法
ユリウス日は、紀元前4712年1月1日から経過した日数です。ユリウス日によって共通の基準で日付を算定できます。日付ファンクションTO_DATE
とTO_CHAR
で日付書式モデル「J」を使用して、OracleのDATE
値とユリウス日の間で変換を行うことができます。
ノート:
Oracle Databaseでは、ユリウス日の計算に天文学方式を使用しています。この方式では、紀元前4713年は-4712として計算されます。これに対し、歴史学方式では、紀元前4713年は-4713として計算されます。Oracleのユリウス日を、歴史学方式で計算した値と比較する場合には、紀元前の日付に365日の違いがあることに注意してください。詳細は、http://aa.usno.navy.mil/faq/docs/millennium.php
を参照してください。
デフォルトの日付値は次のように決まります。
-
年は現在の年で、
SYSDATE
で戻されます。 -
月は現在の月で、
SYSDATE
で戻されます。 -
日は01、つまり月の最初の日になります。
-
時、分、秒はすべて0です。
これらのデフォルト値は、次の例(5月に発行)のように、日付が指定されていない場合に日付値を要求する問合せで使用されます。
SELECT TO_DATE('2009', 'YYYY') FROM DUAL; TO_DATE(' --------- 01-MAY-09
例
次の文は、2009年1月1日に相当するユリウス日を戻します。
SELECT TO_CHAR(TO_DATE('01-01-2009', 'MM-DD-YYYY'),'J') FROM DUAL; TO_CHAR ------- 2454833
関連項目:
DUAL
表については、DUAL表からの選択を参照してください。
TIMESTAMPデータ型
TIMESTAMP
データ型は、DATE
データ型の拡張機能です。DATE
データ型の年、月および日に加えて、時、分および秒の値を格納します。このデータ型は、正確な時刻値の格納と、複数の地域にまたがる日時情報の収集および評価に有効です。TIMESTAMP
データ型は次のように指定します。
TIMESTAMP [(fractional_seconds_precision)]
fractional_seconds_precision
には、オプションで、Oracleが格納する桁数を、SECOND
日時フィールドの小数部まで指定します。このデータ型の列を作成する場合、値は0から9までの範囲内の数に設定できます。デフォルトは6です。
関連項目:
文字データからTIMESTAMP
データへの変換については、「TO_TIMESTAMP」を参照してください。
TIMESTAMP WITH TIME ZONEデータ型
TIMESTAMP
WITH
TIME
ZONE
は、タイムゾーン地域名
またはタイムゾーン・オフセットを値に含むTIMESTAMPの変形です。タイムゾーン・オフセットは、ローカルの時刻とUTC(時および分)との差異です。このデータ型は、ローカル・タイムゾーン情報を保持する場合に有効です。
TIMESTAMP
WITH
TIME
ZONE
データ型は、次のように指定します。
TIMESTAMP [(fractional_seconds_precision)] WITH TIME ZONE
fractional_seconds_precision
には、オプションで、Oracleが格納する桁数を、SECOND
日時フィールドの小数部まで指定します。このデータ型の列を作成する場合、値は0から9までの範囲内の数に設定できます。デフォルトは6です。
Oracleのタイムゾーン・データは、http://www.iana.org/time-zones/
で入手できるパブリック・ドメイン情報から導出されます。Oracleのタイムゾーン・データは、このサイトで入手できる最新のデータを反映していない場合があります。
関連項目:
-
Oracleのタイムゾーン・データの詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。
-
夏時間のサポートについては、「夏時間のサポート」および表2-19を参照してください。
-
文字データから
TIMESTAMP
WITH
TIME
ZONE
データへの変換については、「TO_TIMESTAMP_TZ」を参照してください。 -
ERROR_ON_OVERLAP_TIME
セッション・パラメータについては、「ALTER SESSION」を参照してください。
TIMESTAMP WITH LOCAL TIME ZONEデータ型
TIMESTAMP
WITH
LOCAL
TIME
ZONE
は、TIMESTAMP
のもう1つの変形であり、タイムゾーン情報を識別します。これは、TIMESTAMP
WITH
TIME
ZONE
とは異なり、データベースに格納されるデータはデータベース・タイムゾーンに対して正規化され、タイムゾーン情報は列データの一部として格納されません。ユーザーがデータを検索すると、Oracleはユーザーのローカル・セッション・タイムゾーンのデータを戻します。このデータ型は、2層アプリケーションでクライアント・システムのタイムゾーンの日時情報を常に表示する場合に有効です。
TIMESTAMP
WITH
LOCAL
TIME
ZONE
データ型は、次のように指定します。
TIMESTAMP [(fractional_seconds_precision)] WITH LOCAL TIME ZONE
fractional_seconds_precision
には、オプションで、Oracleが格納する桁数を、SECOND
日時フィールドの小数部まで指定します。このデータ型の列を作成する場合、値は0から9までの範囲内の数に設定できます。デフォルトは6です。
Oracleのタイムゾーン・データは、http://www.iana.org/time-zones/
で入手できるパブリック・ドメイン情報から導出されます。Oracleのタイムゾーン・データは、このサイトで入手できる最新のデータを反映していない場合があります。
関連項目:
-
Oracleのタイムゾーン・データの詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。
-
このデータ型の使用例は、『Oracle Database開発ガイド』を参照してください。文字データから
TIMESTAMP
WITH
LOCAL
TIME
ZONE
データへの変換については、CASTを参照してください。
INTERVAL YEAR TO MONTHデータ型
INTERVAL
YEAR
TO
MONTH
は、YEAR
およびMONTH
日時フィールドを使用して期間を格納します。このデータ型は、年および月の値のみが重要な場合に、2つの日時の値の正確な違いを表す場合に有効です。
INTERVAL
YEAR
TO
MONTH
は、次のように指定します。
INTERVAL YEAR [(year_precision)] TO MONTH
year_precision
は、YEAR
日時フィールドの桁数です。year_precision
のデフォルト値は2です。
期間値をリテラルとして指定すると、高い柔軟性が得られます。期間値をリテラルとして指定する方法の詳細は、期間リテラルを参照してください。期間の使用例は、日時および期間の例を参照してください。
INTERVAL DAY TO SECONDデータ型
INTERVAL
DAY
TO
SECOND
データ型には、日、時間、分および秒による期間が格納されます。このデータ型は、2つの日時の値の正確な違いを表す場合に有効です。
このデータ型は次のように指定します。
INTERVAL DAY [(day_precision)] TO SECOND [(fractional_seconds_precision)]
説明:
-
day_precision
は、DAY
日時フィールドの桁数です。0から9までの値を使用できます。デフォルトは2です。 -
fractional_seconds_precision
は、SECOND
日時フィールドの小数部の桁数です。0から9までの値を使用できます。デフォルトは6です。
期間値をリテラルとして指定すると、高い柔軟性が得られます。期間値をリテラルとして指定する方法の詳細は、期間リテラルを参照してください。期間の使用例は、日時および期間の例を参照してください。
日時および期間の演算
日付(DATE
)、タイムスタンプ(TIMESTAMP
、TIMESTAMP
WITH
TIME
ZONE
およびTIMESTAMP
WITH
LOCAL
TIME
ZONE
)および期間(INTERVAL
DAY
TO
SECOND
およびINTERVAL
YEAR
TO
MONTH
)データに対して、様々な演算処理を実行できます。Oracleは、次の規則に基づいて結果を計算します。
-
日付およびタイムスタンプ値の演算処理では
NUMBER
定数を使用できますが、期間値では使用できません。Oracleは、タイムスタンプ値を内部的に日付値に変換し、日時の演算で使用されるNUMBER
定数と期間式を日数として解析します。たとえば、SYSDATE
+ 1は明日です。SYSDATE
-7は1週間前です。SYSDATE
+ (10/1440)は10分後です。SYSDATE
からemployees
サンプル表のhire_date
列を引くと、各従業員が雇用されてから経過した日数が戻ります。日付値またはタイムスタンプ値の乗算や除算はできません。 -
Oracleは、
BINARY_FLOAT
オペランドおよびBINARY_DOUBLE
オペランドを暗黙的にNUMBER
に変換します。 -
各
DATE
値には時刻コンポーネントが含まれるため、多くの場合、日付操作の結果には小数部が含まれます。この小数部は、日を単位として表されています。たとえば、1.5日は36時間です。小数部は、DATE
データの一般的な操作を行うOracle組込みファンクションによっても戻されます。たとえば、MONTHS_BETWEEN
ファンクションは、2つの日付の間の月数を戻します。結果の小数部は、月(1か月は31日)を単位として表されます。 -
1つのオペランドが
DATE
値または数値であり、タイムゾーンおよび小数部コンポーネントのいずれも含まない場合、次のようになります。-
Oracleは、他方のオペランドを暗黙的に
DATE
データに変換します。ただし、数値と期間を掛けて期間を戻す乗算を行う場合は除きます。 -
他方のオペランドがタイムゾーン値を持つ場合、Oracleは戻り値でセッション・タイムゾーンを使用します。
-
他方のオペランドが小数部の値を持つ場合、その小数部の値は失われます。
-
-
DATE
データ型専用に設計された組込みファンクションにタイムスタンプ値、期間値または数値を渡すと、OracleはDATE
値以外の値を暗黙的にDATE
値に変換します。DATE
への暗黙的な変換を実行するファンクションの詳細は、日時ファンクションを参照してください。 -
期間の計算が日時の値を戻す場合、その結果は実際の日時の値である必要があります。実際の日時の値でない場合、データベースはエラーを戻します。たとえば、次の2つの文はエラーを戻します。
SELECT TO_DATE('31-AUG-2004','DD-MON-YYYY') + TO_YMINTERVAL('0-1') FROM DUAL; SELECT TO_DATE('29-FEB-2004','DD-MON-YYYY') + TO_YMINTERVAL('1-0') FROM DUAL;
最初の文は、1か月31日の月に1か月が追加され、9月31日となります。これは有効な日付ではないため、この文は失敗します。2つ目の文は、4年に一度のみ存在する日付に1年を追加する計算は無効であるため、失敗します。ただし、2月29日に4年を追加する計算は有効であるため、次の文は成功します。
SELECT TO_DATE('29-FEB-2004', 'DD-MON-YYYY') + TO_YMINTERVAL('4-0') FROM DUAL; TO_DATE(' --------- 29-FEB-08
-
Oracleは、すべてのタイムスタンプの演算をUTC時間で実行します。
TIMESTAMP
WITH
LOCAL
TIME
ZONE
では、Oracleは、日時の値をデータベース・タイムゾーンからUTCに変換し、演算を実行した後にデータベース・タイムゾーンに変換しなおします。TIMESTAMP
WITH
TIME
ZONE
では、日時の値は常にUTCであるため、変換は必要ありません。
表2-5に、日時の演算処理のマトリックスを示します。ダッシュはサポートされていない処理を表します。
表2-5 日時の演算のマトリックス
オペランドおよび演算子 | DATE | TIMESTAMP | INTERVAL | 数値 |
---|---|---|---|---|
DATE |
||||
+ |
|
|
|
|
- |
|
|
|
|
* |
|
|
|
|
/ |
|
|
|
|
TIMESTAMP |
||||
+ |
|
|
|
|
- |
|
|
|
|
* |
|
|
|
|
/ |
|
|
|
|
INTERVAL |
||||
+ |
|
|
|
|
- |
|
|
|
|
* |
|
|
|
|
/ |
|
|
|
|
数値 |
||||
+ |
|
|
|
|
- |
|
|
|
|
* |
|
|
|
|
/ |
|
|
|
|
例
期間値の式を開始時間に追加できます。order_date
列を持つサンプル表oe.orders
について考えます。次の文は、order_date
列の値に30日を加算します。
SELECT order_id, order_date + INTERVAL '30' DAY AS "Due Date" FROM orders ORDER BY order_id, "Due Date";
夏時間のサポート
Oracle Databaseは、指定したタイムゾーン地域に、夏時間が適用されているかを自動的に判断し、それに応じてローカル時刻の値を戻します。日時の値は、境界を除いたすべての指定した地域において、夏時間が適用されているかをOracleが判断するために有効です。夏時間の開始または終了時に、境界が発生します。たとえば、米国の太平洋地域では、夏時間の開始時、時刻は午前2時から午前3時に変更されます。午前2時と午前3時の間の1時間は存在しません。夏時間の終了時、時刻は午前2時から午前1時に変更されます。午前1時と午前2時の間の1時間は繰り返されます。
このような境界を解決するために、OracleはTZR
およびTZD
書式要素を使用します。詳細は、表2-19を参照してください。TZR
は、日時の入力文字列でタイムゾーン地域名を表します。たとえば、'Australia/North
'、'UTC
'および'Singapore
'などです。TZD
は、夏時間情報を含むタイムゾーン地域名の略称書式です。たとえば、米国/太平洋標準時はPST
、米国/太平洋夏時間はPDT
などです。TZR
およびTZD
書式要素の値を表示するには、V$TIMEZONE_NAMES
動的パフォーマンス・ビューのTZNAME
およびTZABBREV
列に問合せを実行してください。
ノート:
夏時間機能には、タイムゾーン地域名が必要です。この名前は、大小2つのタイムゾーン・ファイルに格納されます。これらのファイルのうち、使用する環境および使用するOracle Databaseのリリースに応じて、いずれか一方がデフォルトのファイルになります。タイムゾーン・ファイルおよびタイムゾーン名の詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。
両方のファイル内のすべてのタイムゾーン地域名のリストは、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。
Oracleのタイムゾーン・データは、http://www.iana.org/time-zones/
で入手できるパブリック・ドメイン情報から導出されます。Oracleのタイムゾーン・データは、このサイトで入手できる最新のデータを反映していない場合があります。
関連項目:
-
書式要素の詳細は、日時書式モデルを参照してください。また、セッション・パラメータERROR_ON_OVERLAP_TIMEの説明も参照してください。
-
Oracleのタイムゾーン・データの詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。
-
動的パフォーマンス・ビューの詳細は、『Oracle Databaseリファレンス』を参照してください。
日時および期間の例
次の例では、日時および期間データ型の指定方法を示します。
CREATE TABLE time_table (start_time TIMESTAMP, duration_1 INTERVAL DAY (6) TO SECOND (5), duration_2 INTERVAL YEAR TO MONTH);
start_time
列は、TIMESTAMP
型です。TIMESTAMP
の暗黙的な小数部の精度は6です。
duration_1
列は、INTERVAL
DAY
TO
SECOND
型です。DAY
フィールドの最大桁数は6です。また、小数部の最大桁数は5です(その他のすべての日時フィールドの最大桁数は2です)。
duration_2
列は、INTERVAL
YEAR
TO
MONTH
型です。各フィールド(YEAR
およびMONTH
)の値の最大桁数は2です。
期間データ型には書式モデルはありません。そのため、これらの表示を調整するには、EXTRACT
などの文字ファンクションを結合させて要素を連結させる必要があります。たとえば、次の例では、hr.employees
とoe.orders
表にそれぞれ問合せを行い、期間出力の書式を"yy-mm"から"yy years mm months"に、および"dd-hh"から"dddd days hh hours"に変更します。
SELECT last_name, EXTRACT(YEAR FROM (SYSDATE - hire_date) YEAR TO MONTH) || ' years ' || EXTRACT(MONTH FROM (SYSDATE - hire_date) YEAR TO MONTH) || ' months' "Interval" FROM employees; LAST_NAME Interval ------------------------- -------------------- OConnell 2 years 3 months Grant 1 years 9 months Whalen 6 years 1 months Hartstein 5 years 8 months Fay 4 years 2 months Mavris 7 years 4 months Baer 7 years 4 months Higgins 7 years 4 months Gietz 7 years 4 months . . . SELECT order_id, EXTRACT(DAY FROM (SYSDATE - order_date) DAY TO SECOND) || ' days ' || EXTRACT(HOUR FROM (SYSDATE - order_date) DAY TO SECOND) || ' hours' "Interval" FROM orders; ORDER_ID Interval ---------- -------------------- 2458 780 days 23 hours 2397 685 days 22 hours 2454 733 days 21 hours 2354 447 days 20 hours 2358 635 days 20 hours 2381 508 days 18 hours 2440 765 days 17 hours 2357 1365 days 16 hours 2394 602 days 15 hours 2435 763 days 15 hours . . .
RAWデータ型とLONG RAWデータ型
RAW
データ型とLONG
RAW
データ型には、異なるシステム間でデータを移動する際にOracle Databaseによって明示的に変換されないデータが格納されます。これらのデータ型は、2進データおよびバイト列のために用意されています。たとえば、LONG
RAW
は、図形、音声、文書、またはバイナリ・データの配列の格納に使用できますが、解析方法は用途によって異なります。
LONG
RAW
列をバイナリLOB(BLOB
)へ変換することをお薦めします。LOB列は、LONG
列ほど制限は多くありません。詳細は、「TO_LOB」を参照してください。
RAW
は、VARCHAR2
と同様に可変長データ型ですが、Oracle Net(クライアント・ソフトウェアとデータベース、またはデータベースとデータベースを接続します)およびOracleのインポート/エクスポート・ユーティリティは、RAW
またはLONG
RAW
データの転送時に文字変換を行いません。これに対し、Oracle NetおよびOracleのインポート/エクスポート・ユーティリティは、自動的にCHAR
、VARCHAR2
およびLONG
データをあるデータベース文字セットから別のデータベース文字セットに変換するか(データがデータベース間で送信される場合)、またはデータベース文字セットからクライアント文字セットに変換します(データがデータベースとクライアントの間で送信される場合)。クライアント文字セットは、クライアント・インタフェースのタイプ(OCIやJDBCなど)およびクライアント構成(たとえば、NLS_LANG
環境変数)によって決定されます。
OracleがRAW
または LONG
RAW
データを文字データに暗黙的に変換する場合、結果として生成される文字値は、バイナリ入力を16進表記で表したものになり、各文字はRAW
データの連続した4つのビットを表す16進数(0
-9
、A
-F
)になります。たとえば、ビット列が11001011で表示される1バイトのRAW
データは、CB
という値になります。
Oracleは、文字データをRAW
またはLONG
RAW
に暗黙的に変換する場合、連続した入力文字をバイナリ・データの4つの連続したビットを16進表記で表したものとして解釈し、これらのビットを連結してRAW
またはLONG
RAW
値を生成します。入力文字の中に16進数(0
-9
、A
-F
、a
-f
)以外の文字がある場合は、エラーが報告されます。文字数が奇数の場合、結果は未定義になります。
SQLファンクションRAWTOHEX
およびHEXTORAW
は、前述の暗黙的な変換と同等の明示的な変換を行います。オラクル社が提供するPL/SQLパッケージ(UTL_RAW
およびUTL_I18N
)のファンクションを使用すると、RAW
および文字データ間の他のタイプの変換を行うことができます。
ラージ・オブジェクト(LOB)・データ型
組込みLOBデータ型のBLOB
、CLOB
、NCLOB
(内部ファイルに格納)およびBFILE
(外部ファイルに格納)には、構造化されていない大きいデータ(text、image、video、spatial dataなど)を格納できます。BLOB
、CLOB
およびNCLOB
データの最大サイズは、232から1を引いたバイト数にLOB記憶域のCHUNK
パラメータの値を掛けた値です。データベースの表領域が標準のブロック・サイズで、LOB列を作成したときにLOB記憶域のCHUNK
パラメータのデフォルト値を使用した場合には、前述の値は232バイトから1を引いた値にデータベース・ブロック・サイズを掛けた値に等しくなります。BFILE
データの最大サイズは、264バイトから1を引いた値ですが、この最大サイズはオペレーティング・システムによって制限される場合があります。
表を作成するときに、LOB列またはLOBオブジェクト属性に、オプションで表に指定したものとは異なる表領域および記憶特性を指定できます。
LOB列の作成時に行の記憶域を使用可能にしている場合、CLOB
、NCLOB
およびBLOB
の値は、約4000バイトを上限として表内に格納されます。4000バイトを超えるLOBは、常に外部ファイルに格納されます。詳細は、「ENABLE STORAGE IN ROW」を参照してください。
LOB列には、内部のLOB値(データベース内)または外部のLOB値(データベース外)を参照できるLOBロケータが含まれています。表からLOBを選択すると、実際にはLOBのロケータが戻され、LOB値全体は戻されません。LOBに対するDBMS_LOB
パッケージとOracle Call Interface(OCI)の操作は、これらのロケータを介して行われます。
LOBは、LONG
型およびLONG
RAW
型と似ていますが、次の点で異なります。
-
LOBは、オブジェクト型(ユーザー定義のデータ型)の属性に指定できます。
-
LOBロケータは、表の列に格納されます。実際のLOB値は、表の列に格納される場合と格納されない場合があります。
BLOB
、NCLOB
およびCLOB
の値は、別々の表領域に格納されます。BFILE
データは、サーバー上の外部ファイルに格納されます。 -
LOB列にアクセスしたときに戻されるのはロケータです。
-
LOBの最大サイズは、232から1を引いたバイト数にデータベース・ブロック・サイズを掛けた値です。
BFILE
データの最大サイズは、264バイトから1を引いた値ですが、この最大サイズはオペレーティング・システムによって制限される場合があります。 -
LOBでは、効果的かつランダムなピース単位のデータ・アクセスおよび操作が可能です。
-
1つの表内に2つ以上のLOB列を定義できます。
-
NCLOB
の例外を除いて、1つのオブジェクトに1つ以上のLOB属性を定義できます。 -
LOBバインド変数を宣言できます。
-
LOB列とLOB属性を選択できます。
-
1つ以上のLOB列または1つ以上のLOB属性を持つオブジェクトが含まれている新しい行を挿入したり、既存の行を更新できます。更新操作では、内部LOB値を
NULL
、つまり空に設定したり、LOB全体をデータに置き換えられます。BFILE
は、NULL
に設定したり、別のファイルを指すように設定できます。 -
LOB行と列の交差部またはLOB属性を、別のLOB行と列の交差部またはLOB属性を使用して更新できます。
-
LOB列またはLOB属性が含まれている行を削除できます(これによってLOB値も削除されます)。BFILEの場合、実際のオペレーティング・システム・ファイルは削除されません。
INSERT
文またはUPDATE
文を発行するだけで、表内LOB列(データベースに格納されているLOB列)またはLOB属性(データベースに格納されているオブジェクト型列の属性)の行にアクセスして移入することができます。
LOB列の制限事項
LOB列には次のルールと制限があります。詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください。
関連項目:
-
これらのインタフェースおよびLOBの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』および『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。
-
LONG
列からLOB列への変換については、「ALTER TABLE」のmodify_col_properties
句および「TO_LOB」を参照してください。
BFILEデータ型
BFILE
データ型を使用すると、Oracle Database外のファイル・システムに格納されているバイナリ・ファイルLOBにアクセスできます。BFILE
列または属性には、サーバーのファイル・システム上のバイナリ・ファイルに対するポインタとして機能する、BFILE
ロケータが格納されます。ロケータには、ディレクトリ名とファイル名が保持されます。
BFILENAME
ファンクションを使用すると、実表のデータに影響を与えずにBFILE
のファイル名およびパスを変更できます。この組込みSQLファンクションの詳細は、「BFILENAME」を参照してください。
バイナリ・ファイルLOBは、トランザクションには関係なく、リカバリができません。ファイルの統合性と耐久性を提供しているのは基本にあるオペレーティング・システムです。BFILE
データの最大サイズは、264バイトから1を引いた値ですが、この最大サイズはオペレーティング・システムによって制限される場合があります。
データベース管理者は、外部ファイルが存在し、Oracleのプロセスがファイルに対するオペレーティング・システムの読取り権限を持っていることを確認する必要があります。
BFILE
データ型を使用すると、サイズが大きいバイナリ・ファイルの読取り専用のサポートが有効になります。この場合、ファイルを修正またはレプリケートすることはできません。Oracleでは、ファイル・データにアクセスするためのAPIが提供されています。ファイル・データにアクセスするために使用する主なインタフェースは、DBMS_LOB
パッケージとOracle Call Interface(OCI)です。
関連項目:
LOBの詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』および『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。また、「CREATE DIRECTORY」も参照してください。
BLOBデータ型
BLOB
データ型は、構造化されていないバイナリ・ラージ・オブジェクトを格納するために使用します。BLOB
オブジェクトは、文字セットのセマンティクスを持たないビットストリームとして考えることができます。BLOB
オブジェクトには、4GBから1を引いたバイト数にLOB記憶域のCHUNK
パラメータの値を掛けた値のサイズまでのバイナリ・データを格納できます。データベースの表領域が標準のブロック・サイズで、LOB列を作成したときにLOB記憶域のCHUNK
パラメータのデフォルト値を使用した場合には、前述の値は4GBから1を引いた値にデータベース・ブロック・サイズを掛けた値に等しくなります。
BLOB
オブジェクトでは、トランザクションが完全にサポートされます。SQL、DBMS_LOB
パッケージまたはOracle Call Interface(OCI)を介して行った変更は、すべてトランザクションに反映されます。BLOB
値の操作は、コミットおよびロールバックできます。ただし、1つのトランザクションのPL/SQLまたはOCI変数をBLOB
ロケータに保存し、そのロケータを別のトランザクションまたはセッションで使用することはできません。
CLOBデータ型
CLOB
データ型は、シングルバイトおよびマルチバイト・キャラクタ・データを格納するために使用します。固定幅および可変幅の文字セットがサポートされます。両方の文字セットでデータベース文字セットを使用します。CLOB
オブジェクトには、4GBから1を引いたバイト数にLOB記憶域のCHUNK
パラメータの値を掛けた値のサイズまでの文字データを格納できます。データベースの表領域が標準のブロック・サイズで、LOB列を作成したときにLOB記憶域のCHUNK
パラメータのデフォルト値を使用した場合には、前述の値は4GBから1を引いた値にデータベース・ブロック・サイズを掛けた値に等しくなります。
CLOB
オブジェクトでは、トランザクションが完全にサポートされます。SQL、DBMS_LOB
パッケージまたはOracle Call Interface(OCI)を介して行った変更は、すべてトランザクションに反映されます。CLOB
値の操作は、コミットおよびロールバックできます。ただし、1つのトランザクションのPL/SQLまたはOCI変数をCLOB
ロケータに保存し、そのロケータを別のトランザクションまたはセッションで使用することはできません。
NCLOBデータ型
NCLOB
データ型は、Unicodeデータを格納するために使用します。固定幅および可変幅の文字セットがサポートされます。両方の文字セットで各国語文字セットを使用します。NCLOB
オブジェクトには、4GBから1を引いたバイト数にLOB記憶域のCHUNK
パラメータの値を掛けた値のサイズまでの文字テキスト・データを格納できます。データベースの表領域が標準のブロック・サイズで、LOB列を作成したときにLOB記憶域のCHUNK
パラメータのデフォルト値を使用した場合には、前述の値は4GBから1を引いた値にデータベース・ブロック・サイズを掛けた値に等しくなります。
NCLOB
オブジェクトでは、トランザクションが完全にサポートされます。SQL、DBMS_LOB
パッケージまたはOCIを介して行った変更は、すべてトランザクションに反映されます。NCLOB
値の操作は、コミットおよびロールバックできます。ただし、1つのトランザクションのPL/SQLまたはOCI変数をNCLOB
ロケータに保存し、そのロケータを別のトランザクションまたはセッションで使用することはできません。
関連項目:
Unicodeデータ型のサポートについては、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。
拡張データ型
Oracle Database 12cからは、VARCHAR2
、NVARCHAR2
およびRAW
データ型の最大サイズの32767バイトを指定できます。この新しい最大サイズをデータベースでサポートするかどうかは、初期化パラメータMAX_STRING_SIZE
を次のように設定することで制御できます。
-
MAX_STRING_SIZE
=
STANDARD
の場合、Oracle Database 12cより前のリリースのサイズ制限が適用されます。このサイズ制限は、VARCHAR2
データ型とNVARCHAR2
データ型については4,000バイト、およびRAW
データ型については2,000バイトになります。これはデフォルトです。 -
MAX_STRING_SIZE
=
EXTENDED
の場合、VARCHAR2
、NVARCHAR2
、およびRAW
の各データ型について、サイズ制限は32,767バイトになります。
関連項目:
MAX_STRING_SIZE
= EXTENDED
を設定すると、データベース・オブジェクトを更新することになる場合があり、そのオブジェクトを無効化してしまう可能性があります。このパラメータの影響と、この新機能を設定して有効化する方法の詳細は、『Oracle Databaseリファレンス』を参照してください。
4,000バイト以上のサイズを宣言したVARCHAR2
データ型またはNVARCHAR2
データ型、または2,000バイト以上のサイズを宣言したRAW
データ型は、拡張データ型になります。拡張データ型の列は、OracleのLOBテクノロジを利用して表外に格納されます。LOB記憶域は、常に表と連動します。自動セグメント領域管理(ASSM)で管理された表領域の場合、拡張データ型の列はSecureFiles LOBとして格納されます。それ以外の場合は、BasicFiles LOBとして格納されます。記憶域メカニズムとしてのLOBは、内部使用に限定されています。そのため、これに該当するLOBは、DBMS_LOB
を使用して操作することはできません。
ノート:
-
BasicFiles LOBを記憶域メカニズムとして使用しないでください。BasicFiles LOBが拡張データ型の列の機能を制限するうえに、将来のリリースでBasicFilesデータ型が非推奨になる予定だからです。
-
拡張データ型には、LOBと同じルールと制限が適用されます。詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください。
RAW
データ型に2,000バイトを超えるサイズを設定するには、MAX_STRING_SIZE
=
EXTENDED
を設定する必要がありますが、RAW
データ型は、そのサイズが4,000バイトを超える場合にのみ、表外LOBとして格納されることに注意してください。たとえば、RAW(3000)
のデータ型を宣言するには、MAX_STRING_SIZE
=
EXTENDED
を設定する必要があります。ただし、その列は表内に格納されます。
拡張データ型は、標準のデータ型と同様に使用できますが、次のような考慮事項があります。
-
拡張データ型の列に対して索引を作成するときや、索引で主キー制約または一意制約を適用する必要があるときの特別な考慮事項は、拡張データ型の列に対する索引の作成を参照してください。
-
リスト・パーティションのパーティション化キー列が拡張データ型の列の場合、パーティションに対して指定しようとする値のリストがパーティション・バウンドの制限(4KB)を超えていることがあります。この問題を回避する方法の詳細は、
CREATE
TABLE
の「list_partitions」句を参照してください。 -
初期化パラメータ
MAX_STRING_SIZE
の値が影響する項目は、次のとおりです。-
テキスト・リテラルの最大長。詳細は、テキスト・リテラルを参照してください。
-
2つの文字列を連結した場合のサイズ制限。詳細は、連結演算子を参照してください。
-
NLSSORT
ファンクションから返される照合キーの長さ。「NLSSORT」を参照してください。 -
XMLFormat
オブジェクトの一部の属性のサイズ。詳細は、XML書式モデルを参照してください。 -
XMLファンクションのXMLCOLATTVAL、XMLELEMENT、XMLFOREST、XMLPI、およびXMLTABLEの一部の式のサイズ。
-
ROWIDデータ型
ROWIDデータ型
Oracle Database固有のヒープ構成表内の行は、ROWIDという行のアドレスを持ちます。疑似列ROWID
を問い合せることによって、ROWIDの行のアドレスを調べることができます。この疑似列の値は、各行のアドレスを表す文字列です。これらの文字列は、ROWID
データ型です。また、ROWID
データ型を持つ実際の列を含む表やクラスタを作成することもできます。Oracle Databaseでは、このような列の値が有効なROWIDであることは保証されません。ROWID
疑似列の詳細は、「疑似列」を参照してください。
ROWIDには、次の情報が含まれています。
-
行を含むデータファイルのデータ・ブロック。この文字列の長さは、オペレーティング・システムによって異なります。
-
データ・ブロック内の行。
-
行を含むデータベース・ファイル。最初のデータファイルは1になります。この文字列の長さは、オペレーティング・システムによって異なります。
-
すべてのデータベース・セグメントに割り当てられる識別番号であるデータ・オブジェクト番号。データ・オブジェクト番号は、データ・ディクショナリ・ビューの
USER_OBJECTS
、DBA_OBJECTS
およびALL_OBJECTS
から取り出すことができます。同じセグメントを共有するオブジェクト(たとえば、同じクラスタ内のクラスタ化された表など)には、同じオブジェクト番号が付けられます。
ROWIDは、BASE 64の値で格納され、文字AからZ、aからz、0から9、プラス記号(+)およびスラッシュ(/)を含めることができます。ROWIDは、直接は使用できません。ROWIDの内容を解析するには、提供されているパッケージDBMS_ROWID
を使用します。パッケージ・ファンクションを使用すると、前述の4つのROWIDの要素に関する情報を抽出して利用できます。
関連項目:
DBMS_ROWID
パッケージで使用できるファンクション、およびこのファンクションの使用方法については、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
UROWIDデータ型
物理アドレスまたは永続アドレス以外のアドレス、またはOracle Databaseが生成したものではないアドレスがある行を持つ表もあります。たとえば、索引編成表の行のアドレスは、移動可能な索引リーフに格納されます。外部表(ゲートウェイを介してアクセスされるDB2表など)のROWIDは、Oracle標準のROWIDではありません。
Oracleでは、ユニバーサルROWID(UROWID)を使用して索引構成表および外部キー表のアドレスを格納します。索引構成表には、論理UROWIDがあり、外部キー表には外部キーUROWIDがあります。いずれのタイプのUROWIDも、(ヒープ構成表の物理ROWIDのように)ROWID
疑似列に格納されます。
Oracleは、表の主キーに基づいて論理ROWIDを作成します。論理ROWIDは、主キーが変更されないかぎり、変更されません。索引構成表のROWID
疑似列のデータ型は、UROWID
です。この疑似列には、ヒープ構成表のROWID
疑似列と同様に(SELECT
... ROWID
文を使用して)アクセスできます。索引構成表のROWID
を格納する場合、表にUROWID
型の列を定義し、この列にROWID
疑似列の値を取り込みます。
ANSI、DB2、SQL/DSのデータ型
表とクラスタを作成するSQL文では、ANSIデータ型、およびIBM社の製品SQL/DSとDB2のデータ型も使用できます。Oracleでは、Oracle Databaseのデータ型の名前と異なるANSIまたはIBMのデータ型の名前を認識します。データ型をOracleの同等のデータ型に変換して、Oracleのデータ型を列のデータ型の名前として記録し、次の表に示す変換に基づいて、Oracleのデータ型で列データを格納します。
表2-6 Oracleデータ型に変換されるANSIデータ型
ANSI SQLデータ型 | Oracleデータ型 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ノート:
-
NUMERIC
データ型およびDECIMAL
データ型では、固定小数点数のみを指定できます。これらのデータ型では、位取りs
のデフォルトは0です。 -
FLOAT
データ型は、2進精度bを持つ浮動小数点数です。このデータ型のデフォルト精度は、126桁の2進精度または38桁の10進精度です。 -
DOUBLE PRECISION
データ型は126桁の2進精度を持つ浮動小数点数です。 -
REAL
データ型は63桁の2進精度(18桁の10進精度)を持つ浮動小数点数です。
次のSQL/DSとDB2のデータ型には、対応するOracleデータ型がありません。次のデータ型を持つ列は定義しないでください。
-
GRAPHIC
-
LONG
VARGRAPHIC
-
VARGRAPHIC
-
TIME
データ型がTIME
であるデータは、Oracleの日時データとしても表現できます。
関連項目:
表2-7 Oracleデータ型に変換されるSQL/DSとDB2のデータ型
SQL/DSとDB2データ型 | Oracleデータ型 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
ノート:
-
DECIMAL
データ型では、固定小数点数のみを指定できます。このデータ型では、s
のデフォルトは0です。 -
FLOAT
データ型はb
の2進精度を持つ浮動小数点数です。このデータ型のデフォルト精度は126桁の2進精度(38桁の10進精度)です。
ユーザー定義型
ユーザー定義のデータ型は、Oracle組込みデータ型とその他のユーザー定義のデータ型を、アプリケーション内のデータの構造と動作をモデル化するオブジェクト型の構築ブロックとして使用します。次の項で、ユーザー定義型の様々なカテゴリを説明します。
関連項目:
-
Oracle組込みデータ型の詳細は、『Oracle Database概要』を参照してください。
-
ユーザー定義型の作成方法については、「CREATE TYPE」および「CREATE TYPE BODY」を参照してください。
-
ユーザー定義型の使用方法については、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照してください。
オブジェクト型
オブジェクト型とは、実社会エンティティ(たとえば、発注書など)を抽象化し、アプリケーション・プログラムで処理できるようにしたものです。1つのオブジェクト型は、次の3種類のコンポーネントを持つスキーマ・オブジェクトです。
-
名前 - スキーマ内でオブジェクト型を一意に識別するためのものです。
-
属性 - 組込み型またはその他のユーザー定義型です。属性は、実社会エンティティの構造をモデル化します。
-
メソッド - PL/SQLで記述され、データベースに格納されるファンクションまたはプロシージャ、あるいはCやJavaなどの言語で記述され、外部に格納されるファンクションまたはプロシージャのことです。メソッドは、アプリケーションが実社会エンティティに対して実行できる操作を実装します。
REFデータ型
オブジェクト識別子(キーワードOID
で表される)を使用することによって、オブジェクトを一意に識別し、他のオブジェクトまたはリレーショナル表からそのオブジェクトを参照できます。REF
と呼ばれるデータ型のカテゴリが、そのような参照を表します。REF
データ型は、オブジェクト識別子のコンテナです。REF
値は、オブジェクトへのポインタとなります。
REF
値が、存在しないオブジェクトを指している場合、そのREF
はDANGLING(参照先がない)状態であるといいます。DANGLING状態のREF
は、NULLであるREF
と異なります。REF
がDANGLING状態であるかどうかを確認するには、条件IS
[NOT
] DANGLING
を使用します。たとえば、列型がcustomer_typ
(属性cust_email
を持つ)を指しているREF
であるcustomer_ref
列があるとします。このcustomer_ref列を含むオブジェクト・ビューoc_orders
(サンプル・スキーマoe
内)は、次のように指定します。
SELECT o.customer_ref.cust_email FROM oc_orders o WHERE o.customer_ref IS NOT DANGLING;
VARRAY
配列とは、順序付けられたデータ要素の集合です。ある特定の配列のすべての要素は、同じデータ型です。各要素には索引があります。索引は、各要素の配列内での位置に対応する番号です。
配列内の要素数は、その配列のサイズを表します。Oracleの配列は可変サイズであるため、VARRAYと呼ばれます。VARRAYを宣言する場合は、最大サイズを指定する必要があります。
VARRAYの宣言時に領域は割り当てられません。ここでは次のような型を定義します。
-
リレーショナル表の列のデータ型
-
オブジェクト型属性
-
PL/SQLの変数、パラメータ、またはファンクションの戻り型
通常、Oracleは、1つの配列オブジェクトを表内に(その行の他のデータと同じ表領域に)、または表外に(LOBに)格納します。この形式は配列オブジェクトのサイズによって決まります。ただし、VARRAYに個別の記憶特性を指定する場合、Oracleはこれをサイズに関係なく表外に格納します。VARRAYの格納方法の詳細は、「CREATE TABLE」の「varray_col_properties」を参照してください。
ネストした表
ネストした表は、順序付けられていない要素の集合を表現します。要素には組込み型またはユーザー定義型を指定できます。ネストした表は、単一列の表として表示できます。ネストした表がオブジェクト型の場合、オブジェクト型のそれぞれの属性を表す複数列の表としても表示できます。
ネストした表の定義では、領域は割り当てられません。ネストした表では、次のものを宣言するための型を定義します。
-
リレーショナル表の列のデータ型
-
オブジェクト型属性
-
PL/SQLの変数、パラメータ、またはファンクションの戻り型
ネストした表が、リレーショナル表内の列型として使用される場合、またはオブジェクト表の基礎となるオブジェクト型の属性として使用される場合、Oracleは、ネストした表のすべてのデータを単一表に格納し、その単一表を、ネストした表を囲むリレーショナル表またはオブジェクト表に対応付けます。
Oracleが提供する型
Oracleは、組込み型またはANSIがサポートする型が不十分な場合に、新しい型を定義するためのSQLに基づくインタフェースを提供します。これらの型の動作は、C/C++、JavaまたはPL/SQLで実装されます。Oracle Databaseは、入出力、異機種間でのクライアント側の新しいデータ型へのアクセス、およびアプリケーションとデータベース間のデータ転送のための最適化で必要な下位レベルのインフラストラクチャ・サービスを自動的に提供します。
これらのインタフェースは、ユーザー定義(またはオブジェクト)型の作成に使用できます。また、Oracleが有効なデータ型を作成するときに使用します。このようなデータ型のいくつかはサーバーで提供され、横方向の幅広いアプリケーション領域(任意
型など)および縦方向の固有アプリケーション領域(Spatial型など)の両方に役立ちます。
Oracleが提供する型については、次の項で説明します。また、それらの型の実装および使用に関するドキュメントの参照先も示します。
任意型
任意
型は、実際の型が不明なプロシージャ・パラメータおよび表の列の柔軟性が高いモデリングを提供します。これらのデータ型によって、型の記述、データ・インスタンスおよびその他のSQL型の一連のデータ・インスタンスを動的にカプセル化し、アクセスできます。これらの型を構成およびアクセスするには、OCIおよびPL/SQLインタフェースを使用します。
ANYDATA
この型には、指定した型のインスタンスをデータおよび型の記述とともに含めることができます。ANYDATA
は表の列データ型として使用でき、単一の列に異なる型の値を格納できます。値には、SQL組込み型またはユーザー定義型を使用できます。
ANYDATASET
この型には、指定した型の記述およびその型の一連のデータ・インスタンスを含めることができます。ANYDATASET
は、柔軟性が必要なプロシージャ・パラメータのデータ型として使用できます。ユーザー定義型と同様に、SQL組込み型のデータ・インスタンスの値も格納できます。
関連項目:
ANYTYPE
、ANYDATA
およびANYDATASET
型の詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
XML型
eXtensible Markup Language(XML)は、World Wide Web Consortium(W3C)によって開発された、構造化されたデータおよび構造化されていないデータをWebで表示するための標準書式です。Universal Resource Identifiers(URI)は、WebページなどのWeb上のリソースを識別します。Oracleでは、データベース自体に格納されるデータにアクセスするためにDBUriRef
型と呼ばれるURIのクラスと同様に、XMLおよびURIデータを処理するための型が用意されています。また、データベースから外部URIおよび内部URIの両方に格納およびアクセスする型セットを利用できます。
XMLType
Oracleが提供するこの型は、データベースでのXMLデータの格納および問合せに使用します。XMLType
は、XPath式を使用したXMLデータへのアクセス、抽出および問合せに使用するメンバー・ファンクションを持ちます。XPathは、XML文書をトラバースするためにW3Cによって開発された別の規格です。OracleのXMLType
ファンクションは、W3Cの多数のXPath式をサポートします。また、Oracleは、既存のリレーショナルまたはオブジェクト・リレーショナル・データからXMLType
値を作成するためのSQLファンクションおよびPL/SQLパッケージのセットを提供します。
XMLType
はシステム定義型であるため、ファンクションの引数として、あるいは表またはビューの列のデータ型として使用できます。また、XMLType
の表およびビューも作成できます。表にXMLType
列を作成する際は、XMLデータをCLOB
列に(内部的にはCLOB
として格納されるバイナリXMLとして)格納するか、またはオブジェクトと関連付けて格納するかを選択できます。
また、スキーマを登録し(DBMS_XMLSCHEMA
パッケージを使用)、登録したスキーマに適合する表または列を作成できます。この場合、XMLデータは、デフォルトでは基礎となるオブジェクト・リレーショナル列に格納されますが、スキーマ・ベースのデータであっても、CLOB
列またはバイナリXML列に格納するように指定できます。
XMLType
列の問合せおよびDMLは、格納メカニズムとは関係なく、同様に動作します。
関連項目:
XMLType列の使用方法については、『Oracle XML DB開発者ガイド』を参照してください。
URIデータ型
Oracleは、継承階層で関連するURI型のファミリ(URIType
、DBURIType
、XDBURIType
およびHTTPURIType
)を提供します。URIType
はオブジェクト型であり、その他はURIType
のサブタイプです。URIType
はスーパータイプであるため、この型の列を作成し、DBURIType
またはHTTPURIType
型のインスタンスをこの列に格納できます。
HTTPURIType
HTTPUriType
を使用すると、外部のWebページまたはファイルのURLを格納できます。Oracleは、Hypertext Transfer Protocol(HTTP)を使用して、これらのファイルにアクセスします。
XDBURIType
XDBURIType
を使用すると、表の任意のURIType
列に埋込み可能なURIとして、ドキュメントをXMLデータベース階層に展開できます。XDBUriType
は、URLで構成されています。URLは、参照先のXML文書の階層名と、XPath構文を表すオプションのフラグメントで構成されています。フラグメントとURL部分は、シャープ記号(#)で区切ります。次に、XDBUriType
の例を示します。
/home/oe/doc1.xml /home/oe/doc1.xml#/orders/order_item
DBURIType
DBURIType
を使用すると、データベース内のデータを参照するDBURIRef
値を格納できます。DBURIRef
を格納することで、データベースの内部または外部に格納されたデータを参照し、常にデータにアクセスできます。
DBUriRef
値は、データベース内のデータを参照するために、XPathのような表現を使用します。データベースをXMLツリーに想定すると、表、行および列がXML文書の要素です。たとえば、サンプルの人事部門のユーザーhr
は次のようにXMLツリーで表します。
<HR> <EMPLOYEES> <ROW> <EMPLOYEE_ID>205</EMPLOYEE_ID> <LAST_NAME>Higgins</LAST_NAME> <SALARY>12008</SALARY> .. <!-- other columns --> </ROW> ... <!-- other rows --> </EMPLOYEES> <!-- other tables..--> </HR> <!-- other user schemas on which you have some privilege on..-->
DBUriRef
は、この仮想XML文書のXPath式です。したがって、従業員番号205の従業員のSALARY
値をEMPLOYEES
表で参照するには、DBURIRef
を次のように記述します。
/HR/EMPLOYEES/ROW[EMPLOYEE_ID=205]/SALARY
このモデルを使用すると、CLOB
列またはその他の列に格納されたデータを参照し、それらのデータを外部のURLとして外部の世界へ公開できます。
URIFactoryパッケージ
Oracleは、URIType
の様々なサブタイプのインスタンスを作成し、戻すことができるURIFactory
パッケージも提供します。このパッケージは、URL文字列を分析し、URLの種類(HTTP、DBUri
など)を識別し、サブタイプのインスタンスを作成します。DBURI
インスタンスを作成する場合は、URLの先頭に接頭辞/oradb
を付ける必要があります。たとえば、URIFactory.getURI('/oradb/HR/EMPLOYEES')
によってDBURIType
インスタンスが作成され、URIFactory.getUri('/sys/schema')
によってXDBURIType
インスタンスが作成されます。
関連項目:
-
オブジェクト型および型の継承については、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照してください。
-
提供される型およびその実装については、『Oracle XML DB開発者ガイド』を参照してください。
-
Oracle Advanced Queuingでの
XMLType
の使用については、『Oracle Databaseアドバンスト・キューイング・ユーザーズ・ガイド』を参照してください。
Spatial型
Oracle Spatial and Graphは、位置情報アプリケーション、地理情報システム(GIS)・アプリケーションおよびジオイメージング・アプリケーションのユーザーが、空間データ管理をより簡単かつ自然に行えるように設計されています。一度空間データをOracle Databaseに格納すると、そのデータの操作や取得を簡単に行うことができ、データベースに格納された他のすべてのデータと関連付けることもできます。次のデータ型は、Spatial and Graphをインストールしている場合にのみ使用できます。
SDO_GEOMETRY
空間オブジェクトのジオメトリの記述は、ユーザー定義の表の単一行およびオブジェクト型SDO_GEOMETRY
の単一列に格納されます。SDO_GEOMETRY
型の列を含むすべての表は、表に対して一意の主キーを定義する別の列を持つ必要があります。このような表は、ジオメトリ表と呼ばれる場合があります。
SDO_GEOMETRY
オブジェクト型の定義は、次のとおりです。
CREATE TYPE SDO_GEOMETRY AS OBJECT (sgo_gtype NUMBER, sdo_srid NUMBER, sdo_point SDO_POINT_TYPE, sdo_elem_info SDO_ELEM_INFO_ARRAY, sdo_ordinates SDO_ORDINATE_ARRAY); /
SDO_TOPO_GEOMETRY
この型はトポロジ・ジオメトリを記述します。この記述は、ユーザー定義の表の単一行およびオブジェクト型SDO_TOPO_GEOMETRY
の単一列に格納されます。
SDO_TOPO_GEOMETRY
オブジェクト型の定義は、次のとおりです。
CREATE TYPE SDO_TOPO_GEOMETRY AS OBJECT (tg_type NUMBER, tg_id NUMBER, tg_layer_id NUMBER, topology_id NUMBER); /
SDO_GEORASTER
GeoRasterオブジェクト・リレーショナル・モデルでは、ラスター・グリッドまたはイメージ・オブジェクトは、ユーザー定義の表の単一行およびオブジェクト型SDO_GEORASTER
の単一列に格納されます。このような表は、GeoRaster表と呼ばれます。
SDO_GEORASTER
オブジェクト型の定義は、次のとおりです。
CREATE TYPE SDO_GEORASTER AS OBJECT (rasterType NUMBER, spatialExtent SDO_GEOMETRY, rasterDataTable VARCHAR2(32), rasterID NUMBER, metadata XMLType); /
関連項目:
空間データ型の完全な実装および使用のガイドラインは、Oracle Spatial and Graph開発者ガイド、Oracle Spatial and Graphトポロジ・データ・モデルおよびネットワーク・データ・モデル・グラフ開発者ガイドおよびOracle Spatial and Graph GeoRaster開発者ガイドを参照してください。
メディア型
Oracle Multimediaは、マルチメディア・データを記述するために、JavaまたはC++クラスに類似したオブジェクト型を使用できます。これらのオブジェクト型のインスタンスは、メタデータおよびメディア・データを含む属性とメソッドで構成されます。Multimediaのデータ型は、ORDSYS
スキーマで作成されます。パブリック・シノニムがすべてのデータ型に対して存在するため、スキーマ名を指定せずにアクセスできます。
Oracle Multimediaでは、次のオブジェクト型が提供されます。
-
オーディオ・データの格納および管理をサポートします。
-
医用画像の規格として広く認知されている形式であるDigital Imaging and Communications in Medicine(DICOM)の格納および管理をサポートします。
-
オーディオ、イメージ、ビデオ・データなどすべての種類のメディア・データの格納および管理をサポートします。この型は、すべてのメディアを単一列に格納する場合に使用します。
-
イメージ・データの格納および管理をサポートします。
-
ビデオ・データの格納および管理をサポートします。
次のデータ型は、ISO-IEC 13249-5 Still Image規格(一般にSQL/MM StillImageと呼ばれる)に準拠しています。
-
イメージの平均の色によってそのイメージを特徴付けます。
-
色の値をカプセル化します。
-
RAWイメージのサンプルによって表示される色の相対頻度によって、イメージを特徴付けます。
-
前述したオブジェクト型(
SI_AverageColor
、SI_ColorHistogram
、SI_PositionalColor
およびSI_Texture
)が表すイメージの特徴のうち最大4つの特徴を含むリストです。各特徴は、重み付けされます。 -
イメージを
n
×m
個の四角形に分割すると考えた場合、SI_PositionalColor
オブジェクト型は、その四角形の最も重要なn
×m
個の色によってイメージを特徴付けます。 -
高さ、幅、フォーマットなどの固有のイメージ特性を持つデジタル・イメージを表します。
-
繰り返し出現している項目のサイズ(粗さ)、輝度の変化(コントラスト)および主な方向(方向性)によってイメージを特徴付けます。
ノート:
ISO/IEC 13249-5:2001 SQL MM Part5:StillImage規格(通常、SQL/MM Still Image規格と呼ばれる)の第1版に準拠したオブジェクト型に対するOracle Multimediaのサポートは、Oracle Database 12cリリース2 (12.2)では非推奨であり、将来のリリースではサポートされなくなる可能性があります。詳細は、『Oracle Multimediaリファレンス』を参照してください。
関連項目:
-
ORDDicom
オブジェクト型の詳細は、『Oracle Multimedia DICOM開発者ガイド』を参照してください。 -
この項に示されているその他のオブジェクト型の詳細は、『Oracle Multimediaリファレンス』を参照してください。