データ型

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構文を参照してください。

関連項目:

LOB列の制限事項

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

VARCHAR2(size [BYTE | CHAR])

最大長がsizeバイトまたは文字の可変長文字列。VARCHAR2には、sizeを指定する必要があります。最小のsizeは1バイトまたは1文字です。最大のsizeは次のとおりです。

  • MAX_STRING_SIZE = EXTENDEDの場合は、32,767バイト(文字)

  • MAX_STRING_SIZE = STANDARDの場合は、4,000バイト(文字)

MAX_STRING_SIZE初期化パラメータの詳細は、拡張データ型を参照してください。

BYTEは、列がバイト長セマンティクスを持つことを示します。CHARは、列がキャラクタ・セマンティクスを持つことを示します。

1

NVARCHAR2(size)

最大長がsize文字の可変長Unicode文字列。NVARCHAR2には、sizeを指定する必要があります。バイト数は、AL16UTF16エンコードの場合はsizeの2倍まで、UTF8エンコードの場合はsizeの3倍までです。最大のsizeは、各国語文字セット定義によって決定されます。上限は次のとおりです。

  • 32767バイト(MAX_STRING_SIZE = EXTENDEDの場合)

  • 4000バイト(MAX_STRING_SIZE = STANDARDの場合)

MAX_STRING_SIZE初期化パラメータの詳細は、拡張データ型を参照してください。

2

NUMBER [ (p [, s]) ]

精度p、位取りsを持つ数。精度pには1から38の値を指定できます。位取りsには-84から127の値を指定できます。精度とスケールは両方とも10進数です。NUMBERの値は1から22バイトである必要があります。

2

FLOAT [(p)]

精度pを持つNUMBERデータ型のサブタイプ。FLOATの値は、内部的にNUMBERと表されます。精度pには1から126の2進数を指定できます。FLOATの値は1から22バイトである必要があります。

8

LONG

最大2GB(231から1を引いたバイト数)の可変長文字データ。下位互換性を維持するために提供されています。

12

DATE

紀元前4712年1月1日から紀元9999年12月31日までの日付を指定します。デフォルトの書式は、NLS_DATE_FORMATパラメータを使用すると明示的に、NLS_TERRITORYパラメータを使用すると暗黙的に決定される。サイズは7バイトに固定されています。このデータ型には、YEARMONTHDAYHOURMINUTEおよびSECONDの日時フィールドが含まれます。小数部の秒数およびタイムゾーンは含まれません。

100

BINARY_FLOAT

32ビットの浮動小数点数。このデータ型には4バイトが必要です。

101

BINARY_DOUBLE

64ビットの浮動小数点数。このデータ型には8バイトが必要です。

180

TIMESTAMP [(fractional_seconds_precision)]

日付の年、月、日および時刻の時、分、秒の値。fractional_seconds_precisionは、SECOND日時フィールドの小数部の桁数です。fractional_seconds_precisionの有効範囲は0から9です。デフォルトは6です。デフォルトの書式は、NLS_TIMESTAMP_FORMATパラメータによって明示的に決まるか、またはNLS_TERRITORYパラメータによって暗黙的に決まります。サイズは、精度に応じて7または11バイトです。このデータ型には、YEARMONTHDAYHOURMINUTEおよびSECONDの日時フィールドが含まれます。小数部の秒数は含まれますが、タイムゾーンは含まれません。

181

TIMESTAMP [(fractional_seconds_precision)] WITH TIME ZONE

タイムゾーンによる時差などのすべてのTIMESTAMPの値。fractional_seconds_precisionは、SECOND日時フィールドの小数部の桁数です。0から9までの値を使用できます。デフォルトは6です。TIMESTAMP WITH TIME ZONEデータ型のデフォルトの日付書式は、NLS_TIMESTAMP_TZ_FORMAT初期化パラメータによって決定されます。サイズは13バイトに固定されています。このデータ型には、YEARMONTHDAYHOURMINUTESECONDTIMEZONE_HOURおよびTIMEZONE_MINUTEの日時フィールドが含まれます。小数部の秒数および明示的なタイムゾーンが含まれます。

231

TIMESTAMP [(fractional_seconds_precision)] WITH LOCAL TIME ZONE

TIMESTAMP WITH TIME ZONEのすべての値。ただし、次に示す例外があります。

  • データベースへの格納時、データがデータベースのタイムゾーンに正規化されている場合。

  • データの検索時、ユーザーがセッションのタイムゾーンでデータを検索する場合。

デフォルトの書式は、NLS_TIMESTAMP_FORMATパラメータによって明示的に決まるか、またはNLS_TERRITORYパラメータによって暗黙的に決まります。サイズは、精度に応じて7または11バイトです。

182

INTERVAL YEAR [(year_precision)] TO MONTH

年および月で期間を格納。year_precisionは、YEAR日時フィールドの桁数です。0から9までの値を使用できます。デフォルトは2です。サイズは5バイトに固定されています。

183

INTERVAL DAY [(day_precision)] TO SECOND [(fractional_seconds_precision)]

日、時、分および秒で期間を格納。

  • day_precisionは、DAY日時フィールドの最大桁数です。0から9までの値を使用できます。デフォルトは2です。

  • fractional_seconds_precisionは、SECONDフィールドの小数部の桁数です。0から9までの値を使用できます。デフォルトは6です。

サイズは11バイトに固定されています。

23

RAW(size)

長さsizeバイトのバイナリ・データ。RAW値には、size を指定する必要があります。最大のsizeは次のとおりです。

  • 32767バイト(MAX_STRING_SIZE = EXTENDEDの場合)

  • 2000バイト(MAX_STRING_SIZE = STANDARDの場合)

MAX_STRING_SIZE初期化パラメータの詳細は、拡張データ型を参照してください。

24

LONG RAW

最大2GBの可変長バイナリ・データ。

69

ROWID

表の行のアドレスを一意に表すBASE64文字列。主に、ROWID疑似列によって戻される値のためのデータ型です。

208

UROWID [(size)]

索引構成表の行の論理アドレスを表すBASE64文字列。オプションのsizeは、UROWID型の列のサイズです。最大サイズおよびデフォルトは4000バイトです。

96

CHAR [(size [BYTE | CHAR])]

長さsizeバイトまたはsize文字の固定長文字データ。最大のsizeは2000バイトまたは文字です。デフォルトはsizeの最小値の1バイトです。

BYTEおよびCHARは、VARCHAR2と同じセマンティクスを持ちます。

96

NCHAR[(size)]

長さsize文字の固定長文字データ。バイト数は、AL16UTF16エンコードの場合はsizeの2倍まで、UTF8エンコードの場合はsizeの3倍までです。最大のsizeは、各国語文字セット定義(上限2000バイト)によって決定されます。デフォルトはsizeの最小値の1文字です。

112

CLOB

シングルバイト文字またはマルチバイト・キャラクタを含むキャラクタ・ラージ・オブジェクト。固定幅および可変幅の文字セットがサポートされ、両方ともデータベース文字セットで使用されます。最大サイズは、4GBから1を引いたバイト数にデータベース・ブロック・サイズを掛けた値です。

112

NCLOB

Unicodeキャラクタを含むキャラクタ・ラージ・オブジェクト。固定幅および可変幅の文字セットがサポートされます。両方の文字セットでデータベースの各国語文字セットを使用します。最大サイズは、4GBから1を引いたバイト数にデータベース・ブロック・サイズを掛けた値です。各国語文字セット・データが格納されます。

113

BLOB

バイナリ・ラージ・オブジェクト。最大サイズは、4GBから1を引いたバイト数にデータベース・ブロック・サイズを掛けた値です。

114

BFILE

データベース外に保存された大きなバイナリ・ファイルへロケータを格納。データベース・サーバー上に存在する外部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

NUMBER

123.89

123.89

NUMBER(3)

124

123.89

NUMBER(3,2)

精度を超える

123.89

NUMBER(4,2)

精度を超える

123.89

NUMBER(5,2)

123.89

123.89

NUMBER(6,1)

123.9

123.89

NUMBER(6,-2)

100

.01234

NUMBER(4,5)

.01234

.00012

NUMBER(4,5)

.00012

.000127

NUMBER(4,5)

.00013

.0000012

NUMBER(2,7)

.0000012

.00000123

NUMBER(2,7)

.0000012

1.2e-4

NUMBER(2,5)

0.00012

1.2e-5

NUMBER(2,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桁とほぼ等しくなります。

NUMBERFLOATの違いは、例を使用して説明します。次の例では、同じ値が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_FLOAT

BINARY_FLOATは、32ビットの単精度浮動小数点数データ型です。BINARY_FLOATの各値には4バイトが必要です。

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が他のすべての値より大きいとみなし、NaNNaNは等しいと評価します。「浮動小数点条件」を参照してください。

  • 変換演算子が準拠しています。「変換ファンクション」を参照してください。

  • デフォルトの丸めモードがサポートされています。

  • デフォルトの例外処理モードがサポートされています。

  • 特殊な値であるINF、-INFおよびNaNがサポートされています。「浮動小数点条件」を参照してください。

  • BINARY_FLOATおよびBINARY_DOUBLEの値を整数値のBINARY_FLOATおよびBINARY_DOUBLEに丸める方法として、SQLファンクションROUNDTRUNCCEILおよびFLOORが提供されています。

  • BINARY_FLOATおよびBINARY_DOUBLEを10進値に、10進値をBINARY_FLOATおよびBINARY_DOUBLEに丸める方法として、SQLファンクションTO_CHARTO_NUMBERTO_NCHARTO_BINARY_FLOATTO_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列(CLOBNCLOBまたは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」を参照してください。

SQL文の中の次の場所でLONG列を参照できます。

  • SELECTリスト

  • UPDATE文のSET

  • INSERT文のVALUES

LONG値を使用する場合には、次の制限があります。

  • 表には複数の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構文のリスト

  • UNIONINTERSECTまたはMINUS集合演算子によって結合されている副問合せまたは問合せのSELECT構文のリスト

  • CREATE TABLE ... AS SELECT文のSELECT構文のリスト

  • ALTER TABLE ... MOVE

  • INSERT文の副問合せのSELECT構文のリスト

トリガーでは、LONGデータ型は次のように使用されます。

  • トリガー内のSQL文で、データをLONG列に挿入できます。

  • LONG列のデータをCHARVARCHAR2などの制約があるデータ型に変換できる場合は、トリガー内のSQL文でLONG列を参照できます。

  • トリガー内の変数は、LONGデータ型を使用して宣言できません。

  • :NEW:OLDLONG列で使用できません。

Oracle Call Interfaceを使用して、データベースからLONG値の一部を検索できます。

日時および間隔のデータ型

日時データ型には、DATETIMESTAMPTIMESTAMP 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 日時フィールド、および日時と期間の値

日時フィールド 日時に有効な値 期間に有効な値

YEAR

-4712から9999 (0を除きます)

正または負のすべての整数

MONTH

01から12

0から11

DAY

01から31(現在のNLSカレンダ・パラメータに従ったMONTHおよびYEARの値の範囲内)

正または負のすべての整数

HOUR

00から23

0から23

MINUTE

00から59

0から59

SECOND

00から59.9(n)(「9(n)」は秒の小数部の精度。)DATEには適用されません。

00から59.9(n)(「9(n)」は秒の小数部の期間の精度)

TIMEZONE_HOUR

-12から14(この範囲は夏時間の変更を保存します。)DATEまたはTIMESTAMPには適用されません。

該当なし

TIMEZONE_MINUTE

(表の後のノートを参照)

00から59。DATEまたはTIMESTAMPには適用されません。

該当なし

TIMEZONE_REGION

V$TIMEZONE_NAMESデータ・ディクショナリ・ビュー内のTZNAME列を問い合せます。DATEまたはTIMESTAMPには適用されません。すべてのタイムゾーン地域名のリストは、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

該当なし

TIMEZONE_ABBR

V$TIMEZONE_NAMESデータ・ディクショナリ・ビュー内のTZABBREV列を問い合せます。DATEまたはTIMESTAMPには適用されません。

該当なし

ノート:

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_DATETO_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のタイムゾーン・データは、このサイトで入手できる最新のデータを反映していない場合があります。

関連項目:

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のタイムゾーン・データは、このサイトで入手できる最新のデータを反映していない場合があります。

関連項目:

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)、タイムスタンプ(TIMESTAMPTIMESTAMP 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

+

DATE

DATE

-

NUMBER

INTERVAL

DATE

DATE

*

/

TIMESTAMP

+

TIMESTAMP

DATE

-

INTERVAL

INTERVAL

TIMESTAMP

DATE

*

/

INTERVAL

+

DATE

TIMESTAMP

INTERVAL

-

INTERVAL

*

INTERVAL

/

INTERVAL

数値

+

DATE

DATE

NA

-

NA

*

INTERVAL

NA

/

NA

期間値の式を開始時間に追加できます。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のタイムゾーン・データは、このサイトで入手できる最新のデータを反映していない場合があります。

関連項目:

日時および期間の例

次の例では、日時および期間データ型の指定方法を示します。

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.employeesoe.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のインポート/エクスポート・ユーティリティは、自動的にCHARVARCHAR2およびLONGデータをあるデータベース文字セットから別のデータベース文字セットに変換するか(データがデータベース間で送信される場合)、またはデータベース文字セットからクライアント文字セットに変換します(データがデータベースとクライアントの間で送信される場合)。クライアント文字セットは、クライアント・インタフェースのタイプ(OCIやJDBCなど)およびクライアント構成(たとえば、NLS_LANG環境変数)によって決定されます。

OracleがRAWまたは LONG RAWデータを文字データに暗黙的に変換する場合、結果として生成される文字値は、バイナリ入力を16進表記で表したものになり、各文字はRAWデータの連続した4つのビットを表す16進数(0-9A-F)になります。たとえば、ビット列が11001011で表示される1バイトのRAWデータは、CBという値になります。

Oracleは、文字データをRAWまたはLONG RAWに暗黙的に変換する場合、連続した入力文字をバイナリ・データの4つの連続したビットを16進表記で表したものとして解釈し、これらのビットを連結してRAWまたはLONG RAW値を生成します。入力文字の中に16進数(0-9A-Fa-f)以外の文字がある場合は、エラーが報告されます。文字数が奇数の場合、結果は未定義になります。

SQLファンクションRAWTOHEXおよびHEXTORAWは、前述の暗黙的な変換と同等の明示的な変換を行います。オラクル社が提供するPL/SQLパッケージ(UTL_RAWおよびUTL_I18N)のファンクションを使用すると、RAWおよび文字データ間の他のタイプの変換を行うことができます。

ラージ・オブジェクト(LOB)・データ型

組込みLOBデータ型のBLOBCLOBNCLOB(内部ファイルに格納)およびBFILE(外部ファイルに格納)には、構造化されていない大きいデータ(text、image、video、spatial dataなど)を格納できます。BLOBCLOBおよびNCLOBデータの最大サイズは、232から1を引いたバイト数にLOB記憶域のCHUNKパラメータの値を掛けた値です。データベースの表領域が標準のブロック・サイズで、LOB列を作成したときにLOB記憶域のCHUNKパラメータのデフォルト値を使用した場合には、前述の値は232バイトから1を引いた値にデータベース・ブロック・サイズを掛けた値に等しくなります。BFILEデータの最大サイズは、264バイトから1を引いた値ですが、この最大サイズはオペレーティング・システムによって制限される場合があります。

表を作成するときに、LOB列またはLOBオブジェクト属性に、オプションで表に指定したものとは異なる表領域および記憶特性を指定できます。

LOB列の作成時に行の記憶域を使用可能にしている場合、CLOBNCLOBおよび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値は、表の列に格納される場合と格納されない場合があります。BLOBNCLOBおよび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およびラージ・オブジェクト開発者ガイド』を参照してください。

関連項目:

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)です。

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からは、VARCHAR2NVARCHAR2およびRAWデータ型の最大サイズの32767バイトを指定できます。この新しい最大サイズをデータベースでサポートするかどうかは、初期化パラメータMAX_STRING_SIZEを次のように設定することで制御できます。

  • MAX_STRING_SIZE = STANDARDの場合、Oracle Database 12cより前のリリースのサイズ制限が適用されます。このサイズ制限は、VARCHAR2データ型とNVARCHAR2データ型については4,000バイト、およびRAWデータ型については2,000バイトになります。これはデフォルトです。

  • MAX_STRING_SIZE = EXTENDEDの場合、VARCHAR2NVARCHAR2、および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ファンクションのXMLCOLATTVALXMLELEMENTXMLFORESTXMLPI、およびXMLTABLEの一部の式のサイズ。

ROWIDデータ型

データベース内の各行にはアドレスがあります。次の項では、Oracle Databaseにおける行のアドレスの2つの書式について説明します。

ROWIDデータ型

Oracle Database固有のヒープ構成表内の行は、ROWIDという行のアドレスを持ちます。疑似列ROWIDを問い合せることによって、ROWIDの行のアドレスを調べることができます。この疑似列の値は、各行のアドレスを表す文字列です。これらの文字列は、ROWIDデータ型です。また、ROWIDデータ型を持つ実際の列を含む表やクラスタを作成することもできます。Oracle Databaseでは、このような列の値が有効なROWIDであることは保証されません。ROWID疑似列の詳細は、「疑似列」を参照してください。

ROWIDには、次の情報が含まれています。

  • 行を含むデータファイルのデータ・ブロック。この文字列の長さは、オペレーティング・システムによって異なります。

  • データ・ブロック内の

  • 行を含むデータベース・ファイル。最初のデータファイルは1になります。この文字列の長さは、オペレーティング・システムによって異なります。

  • すべてのデータベース・セグメントに割り当てられる識別番号であるデータ・オブジェクト番号。データ・オブジェクト番号は、データ・ディクショナリ・ビューのUSER_OBJECTSDBA_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データ型

CHARACTER(n)

CHAR(n)

CHAR(n)

CHARACTER VARYING(n)

CHAR VARYING(n)

VARCHAR2(n)

NATIONAL CHARACTER(n)

NATIONAL CHAR(n)

NCHAR(n)

NCHAR(n)

NATIONAL CHARACTER VARYING(n)

NATIONAL CHAR VARYING(n)

NCHAR VARYING(n)

NVARCHAR2(n)

NUMERIC[(p,s)]

DECIMAL[(p,s)](ノート1)

NUMBER(p,s)

INTEGER

INT

SMALLINT

NUMBER(38)

FLOAT(ノート2)

DOUBLE PRECISION(ノート3)

REAL(ノート4)

FLOAT(126)

FLOAT(126)

FLOAT(63)

ノート:

  1. NUMERICデータ型およびDECIMALデータ型では、固定小数点数のみを指定できます。これらのデータ型では、位取りsのデフォルトは0です。

  2. FLOATデータ型は、2進精度bを持つ浮動小数点数です。このデータ型のデフォルト精度は、126桁の2進精度または38桁の10進精度です。

  3. DOUBLE PRECISIONデータ型は126桁の2進精度を持つ浮動小数点数です。

  4. 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データ型

CHARACTER(n)

CHAR(n)

VARCHAR(n)

VARCHAR(n)

LONG VARCHAR

LONG

DECIMAL(p,s)(ノート1)

NUMBER(p,s)

INTEGER

SMALLINT

NUMBER(p,0)

FLOAT(ノート2)

NUMBER

ノート:

  1. DECIMALデータ型では、固定小数点数のみを指定できます。このデータ型では、sのデフォルトは0です。

  2. FLOATデータ型はbの2進精度を持つ浮動小数点数です。このデータ型のデフォルト精度は126桁の2進精度(38桁の10進精度)です。

ユーザー定義型

ユーザー定義のデータ型は、Oracle組込みデータ型とその他のユーザー定義のデータ型を、アプリケーション内のデータの構造と動作をモデル化するオブジェクト型の構築ブロックとして使用します。次の項で、ユーザー定義型の様々なカテゴリを説明します。

関連項目:

オブジェクト型

オブジェクト型とは、実社会エンティティ(たとえば、発注書など)を抽象化し、アプリケーション・プログラムで処理できるようにしたものです。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インタフェースを使用します。

ANYTYPE

この型には、任意の名前のあるSQL型または名前のない一時型の型の記述を含めることができます。

ANYDATA

この型には、指定した型のインスタンスをデータおよび型の記述とともに含めることができます。ANYDATAは表の列データ型として使用でき、単一の列に異なる型の値を格納できます。値には、SQL組込み型またはユーザー定義型を使用できます。

ANYDATASET

この型には、指定した型の記述およびその型の一連のデータ・インスタンスを含めることができます。ANYDATASETは、柔軟性が必要なプロシージャ・パラメータのデータ型として使用できます。ユーザー定義型と同様に、SQL組込み型のデータ・インスタンスの値も格納できます。

関連項目:

ANYTYPEANYDATAおよび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型のファミリ(URITypeDBURITypeXDBURITypeおよび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インスタンスが作成されます。

関連項目:

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 Multimediaは、マルチメディア・データを記述するために、JavaまたはC++クラスに類似したオブジェクト型を使用できます。これらのオブジェクト型のインスタンスは、メタデータおよびメディア・データを含む属性とメソッドで構成されます。Multimediaのデータ型は、ORDSYSスキーマで作成されます。パブリック・シノニムがすべてのデータ型に対して存在するため、スキーマ名を指定せずにアクセスできます。

Oracle Multimediaでは、次のオブジェクト型が提供されます。

  • ORDAudio

    オーディオ・データの格納および管理をサポートします。

  • ORDDicom

    医用画像の規格として広く認知されている形式であるDigital Imaging and Communications in Medicine(DICOM)の格納および管理をサポートします。

  • ORDDoc

    オーディオ、イメージ、ビデオ・データなどすべての種類のメディア・データの格納および管理をサポートします。この型は、すべてのメディアを単一列に格納する場合に使用します。

  • ORDImage

    イメージ・データの格納および管理をサポートします。

  • ORDVideo

    ビデオ・データの格納および管理をサポートします。

次のデータ型は、ISO-IEC 13249-5 Still Image規格(一般にSQL/MM StillImageと呼ばれる)に準拠しています。

  • SI_AverageColor

    イメージの平均の色によってそのイメージを特徴付けます。

  • SI_Color

    色の値をカプセル化します。

  • SI_ColorHistogram

    RAWイメージのサンプルによって表示される色の相対頻度によって、イメージを特徴付けます。

  • SI_FeatureList

    前述したオブジェクト型(SI_AverageColorSI_ColorHistogramSI_PositionalColorおよびSI_Texture)が表すイメージの特徴のうち最大4つの特徴を含むリストです。各特徴は、重み付けされます。

  • SI_PositionalColor

    イメージをn×m個の四角形に分割すると考えた場合、SI_PositionalColorオブジェクト型は、その四角形の最も重要なn×m個の色によってイメージを特徴付けます。

  • SI_StillImage

    高さ、幅、フォーマットなどの固有のイメージ特性を持つデジタル・イメージを表します。

  • SI_Texture

    繰り返し出現している項目のサイズ(粗さ)、輝度の変化(コントラスト)および主な方向(方向性)によってイメージを特徴付けます。

ノート:

ISO/IEC 13249-5:2001 SQL MM Part5:StillImage規格(通常、SQL/MM Still Image規格と呼ばれる)の第1版に準拠したオブジェクト型に対するOracle Multimediaのサポートは、Oracle Database 12cリリース2 (12.2)では非推奨であり、将来のリリースではサポートされなくなる可能性があります。詳細は、『Oracle Multimediaリファレンス』を参照してください。

関連項目: