プライマリ・コンテンツに移動
Pro*C/C++プログラマーズ・ガイド
12c リリース1(12.1)
B71397-03
目次へ移動
目次
索引へ移動
索引

前
次

Oracleのデータ型

Oracleでは、内部データ型外部データ型という2種類のデータ型が認識されます。内部データ型は、Oracleでデータベース表に列値を格納する方法と、NULL、SYSDATE、USERなどの疑似列値の表現に使用する形式を指定します。外部データ型は、入力ホスト変数と出力ホスト変数に値を格納するための形式を指定します。

Oracleの内部データ型(ビルトインとも呼ばれます)の詳細は、Oracle Database SQL言語リファレンスを参照してください。

内部データ型

表4-1は、Oracleでデータベースの列に格納される値に使用される内部データ型を示しています。

表4-1 Oracle内部データ型

名前 説明

VARCHAR2

可変長文字列(4000バイト以下)。

NVARCHAR2またはNCHAR VARYING

可変長シングルバイト文字列または各国語キャラクタ文字列(4000バイト以下)。

NUMBER

100をベースとして表された、精度と位取りのある数値。

LONG

可変長文字列(2**31-1バイト以下)。

BINARY_FLOAT

32ビット浮動小数点数(4バイト)。

BINARY_DOUBLE

64ビット浮動小数点数(8バイト)。

TIMESTAMP

日付の年、月、日の値、および、時刻の時、分、および秒の値(7または11バイト)。

DATE

固定長の日付+時刻値(7バイト)。

INTERVAL YEAR

年および月単位の期間を格納します(5バイト)。

INTERVAL DAY

日、時、分および秒単位で期間を格納します(11バイト)。

RAW

可変長バイナリ・データ(2000バイト以下)。

LONG RAW

可変長バイナリ・データ(2**31-1バイト以下)。

ROWID

バイナリ値。

UROWID

バイナリ値(4000バイト以下)。

CHAR

固定長文字列(2000バイト以下)。

NCHAR

固定長シングルバイト文字列または各国語キャラクタ文字列(2000バイト以下)。

CLOB

文字データ(4GB以下)。

NCLOB

各国語キャラクタ・セット・データ(4GB以下)。

BLOB

バイナリ・データ(4GB以下)。

BFILE

外部ファイル・バイナリ・データ(4GB以下)。

これらの内部データ型は、C言語のデータ型とは大きく異なる場合があります。たとえば、C言語にはOracleのNUMBERデータ型と同等のデータ型はありません。ただし、NUMBERは、floatdoubleなどのC言語のデータ型との間で変換できますが、ある程度の制限があります。たとえば、OracleのNUMBERデータ型は小数点以下最大38桁の精度で指定できますが、現行のC言語の実装ではdoubleをそこまでの精度で表せるデータ型はありません。

OracleのNUMBERデータ型は値を正確に(精度の制限内で)表しますが、浮動小数点形式では10.0などの値を正確に表すことができません。

構造化されていないデータ(テキスト、グラフィック・イメージ、ビデオ・クリップまたはサウンド波形)を格納するには、LOBデータ型を使用します。BFILEデータは、データベース外部のオペレーティング・システム・ファイルに格納されます。LOB型には、データの位置を指定するロケータが格納されます。

関連項目:

LOB

NCHARとNVARCHAR2は、マルチバイト・キャラクタ・データの格納に使用されます。

関連項目:

これらのデータ型については、グローバリゼーション・サポートを参照してください。

外部データ型

表4-2のように、外部データ型にはすべての内部データ型と、C言語の構文とほぼ一致するいくつかのデータ型が含まれています。たとえば、STRING外部データ型は、C言語ではNULL終了記号文字列を指します。

表4-2 Oracle外部データ型

名前 説明

VARCHAR2

可変長文字列(65535バイト以下)。

NUMBER

100をベースとして表された10進数。

INTEGER

符号付き整数。

FLOAT

実数。

STRING

NULLで終了する可変長文字列。

VARNUM

10進数(NUMBERと同様だが表現の長さのコンポーネントが含まれる)。

LONG

固定長文字列(2**31-1バイトまで)。

VARCHAR

可変長文字列(65533バイト以下)。

ROWID

バイナリ値(外部の長さはシステムに依存)。

DATE

固定長の日付/時刻値(7バイト)。

VARRAW

可変長バイナリ・データ(65533バイト以下)。

RAW

固定長バイナリ・データ(65535バイト以下)。

LONG RAW

固定長バイナリ・データ(2**31-1バイト以下)。

UNSIGNED

符号なし整数。

LONG VARCHAR

可変長文字列(2**31-5バイト以下)。

LONG VARRAW

可変長バイナリ・データ(2**31-5バイト以下)。

CHAR

固定長文字列(65535バイト以下)。

CHARZ

固定長のNULL終了文字列(65534バイト以下)。

CHARF

CHARのデフォルトをVARCHAR2またはCHARZではなくCHARにするために、TYPE文またはVAR文で使用する。

次にOracleデータ型について簡単に説明します。

VARCHAR2

VARCHAR2データ型を使用して、可変長文字列を格納します。VARCHAR2値の最大長は64KBです。

VARCHAR2(n)値の最大長は、文字数ではなくバイト数で指定します。したがって、VARCHAR2(n)変数にマルチバイト文字を格納すると、最大長はn文字より少なくなります。

Oracleでは、CHAR_MAP=VARCHAR2オプションを使用してプリコンパイルすると、char[n]またはcharとして宣言しているすべてのホスト変数に、VARCHAR2データ型が割り当てられます。

入力時

Oracleは入力ホスト変数に指定されたバイト数を読み込み、後続の空白文字を取り除き、入力値をターゲット・データベース列に格納します。注意してください。未初期化ホスト変数には、一連のヌル文字が含まれている場合があります。したがって、常に文字入力ホスト変数の宣言長まで空白文字で埋め、ヌル文字で終了しないでください。

入力値がデータベース列の定義より長い場合は、エラーが発生します。入力値がすべて空白の場合は、1つのNULLと同様に扱われます。

文字値が有効な数値を表している場合は、Oracleはその文字値をNUMBER列値に変換できます。文字値が有効な数値を表していない場合は、エラーが発生します。

出力時

Oracleは出力ホスト変数に指定されたバイト数を、必要に応じて空白文字で埋めて戻します。続いて、出力値をターゲット・ホスト変数に割り当てます。NULLが戻されると、Oracleはホスト変数に空白文字を埋めます。

出力値がホスト変数の宣言長より長い場合、Oracleはホスト変数に割り当てる前に出力値を切り捨てます。そのホスト変数に標識変数が対応付けられている場合、Oracleは標識変数を出力値の元の長さに設定します。

Oracleでは、NUMBER列値を文字値に変換できます。文字ホスト変数の長さによって精度が決定します。ホスト変数の長さがその数に対して短すぎる場合は、科学表記法が使用されます。たとえば、列値123456789を長さ6の文字ホスト変数にSELECTすると、値1.2E08が戻されます。明示的にNULLが選択された場合、ホスト変数の値は予測不能です。標識変数の値がNULLかどうかをチェックする必要があります。

NUMBER

NUMBERデータ型を使用して、固定小数点数または浮動小数点数を格納します。精度および位取りを指定できます。NUMBER値の最大精度は38です。強度範囲は1.0E-130から9.99...9E125(9が38個に続けて0が88個)です。位取りの範囲は-84から127です。

NUMBER値は、可変長形式(1バイトの指数部に19バイトの仮数部が続く)で格納されます。指数バイトの上位1ビットは符号ビットであり、正数の場合に設定します。下位7ビットは強度を表します。

仮数は38桁の数値を形成し、各バイトは100をベースとする2桁を表します。仮数の符号は、最初(左端)のバイトの値で指定されます。101より大きければ仮数は負であり、その1桁目は左端のバイトから101を差し引いた値と等しくなります。

出力時、ホスト変数にはOracleで内部的に表されたとおりの数値が含まれます。予想される最大の数に対応するには、出力ホスト変数を22バイトの長さにする必要があります。数値を表すために使用されるバイトのみが戻されます。Oracleでは出力値の空白を埋め込んだり、NULLで終了させたりしません。戻された値の長さを知る必要がある場合は、かわりにVARNUMデータ型を使用します。

この外部データ型を使用する必要はほとんどありません。

INTEGER

INTEGERデータ型を使用して、小数部のない数を格納します。整数は符号付きの2バイト、4バイトまたは8バイトの2進数です。ワード内のバイトの順序付けはシステムによって異なります。入力および出力ホスト変数に長さを指定する必要があります。出力時には、列値が実数であれば、小数部が切り捨てられます。

FLOAT

FLOATデータ型を使用して、小数部を持つ数、あるいはINTEGERデータ型の容量を超える数を格納します。数値はご使用のコンピュータの浮動小数点書式を使用して表され、通常、4または8バイトの記憶域を必要とします。入力および出力ホスト変数に長さを指定する必要があります。

Oracleでは、数の内部形式が10進数であるため、ほとんどの浮動小数点処理よりも高い精度で数を表現できます。したがって、FLOAT変数へのフェッチを行うと、精度が低下する可能性があります。

STRING

STRINGデータ型は、VARCHAR2データ型に似ていますが、STRING値は常にヌル文字で終了するという違いがあります。Oracleでは、CHAR_MAP=STRINGオプションを使用してプリコンパイルすると、char[n]またはcharとして宣言しているすべてのホスト変数に、STRINGデータ型が割り当てられます。

入力時

Oracleは指定された長さを使用して、ヌル終端文字のスキャンを制限します。ヌル終端文字が見つからなければ、エラーが生成されます。長さを指定しなければ、最大長は2000バイトと想定されます。STRINGの値の最小長は2バイトです。最初の文字がヌル終端文字で、指定した長さが2の場合、列がNOT NULLと定義されていなければOracleはNULLを挿入します。列がNOT NULLと定義されている場合はエラーが発生します。空白のみの値はそのまま格納されます。

出力時

Oracleは戻された最後の文字に1バイトのヌル文字を追加します。文字列長が指定された長さを超える場合は、Oracleは出力値を切り捨て、1バイトのヌル文字を追加します。NULLがSELECTされた場合は、Oracleは最初の文字位置に1バイトのヌル文字を入れて戻します。明示的にNULLが選択された場合、ホスト変数の値は予測不能です。標識変数の値がNULLかどうかをチェックする必要があります。

VARNUM

VARNUMデータ型はNUMBERデータ型に似ていますが、VARNUM変数の1バイト目にその表現の長さが格納されるという違いがあります。

入力時には、ホスト変数の1バイト目を値の長さに設定する必要があります。出力時には、ホスト変数に長さとそれに続いてOracleで内部的に表現された数が含まれます。この数が最大になっても対応できるように、ホスト変数の長さは22バイトにする必要があります。列値をVARNUMホスト変数にSELECTした後で、1バイト目をチェックして値の長さを取得できます。

通常、このデータ型を使用する理由はほとんどありません。

LONG

LONGデータ型を使用して、固定長文字列を格納します。

LONGデータ型はVARCHAR2データ型に似ていますが、LONG値の最大長は2147483647バイト、つまり2GBであるという違いがあります。

VARCHAR

VARCHARデータ型を使用して、可変長文字列を格納します。VARCHAR変数では、2バイト長のフィールドの後に65533バイト以下の文字列フィールドが続きます。ただし、VARCHAR配列要素では、文字列フィールドの最大長は65530バイトです。VARCHAR変数の長さを指定するときは、長さフィールド用に必ず2バイトを付加してください。さらに長い文字列には、LONG VARCHARデータ型を使用してください。明示的にNULLが選択された場合、ホスト変数の値は予測不能です。標識変数の値がNULLかどうかをチェックする必要があります。

ROWID

索引構成表の行には、永続物理アドレスは設定されていません。論理ROWIDには、物理ROWIDの場合と同じ構文を使用してアクセスします。このため、物理ROWIDは、データ・オブジェクト番号(同じセグメント内のスキーマ・オブジェクト)を格納します。

論理ROWIDと物理ROWIDの両方(およびOracle以外の表のROWID)をサポートするために、ユニバーサルROWIDが定義されました。

文字ホスト変数を使用すると、ROWIDを読取り可能な書式で格納できます。ROWIDを文字ホスト変数にSELECTまたはFETCHすると、その2進値は18バイトの文字列に変換され、次の形式で戻されます。

BBBBBBBB.RRRR.FFFF 

ここで、BBBBBBBBはデータベース・ファイルのブロック、RRRRはブロック内の行(最初の行は0)、FFFFはデータベース・ファイルを示します。これらの値は16進数です。たとえば、次の行IDがあるとします。

0000000E.000A.0007 
points to the 11th row in the 15th block in the 7th database file. 

関連項目:

アプリケーションでユニバーサルROWIDを使用する方法の詳細は、ユニバーサルROWIDを参照してください。

通常、ROWIDを文字ホスト変数にFETCHし、ホスト変数をUPDATE文またはDELETE文のWHERE句のROWID疑似列と比較します。そのようにして、カーソルによってフェッチされた最終行を識別できます。

注意:

完全な移植性が必要な場合、あるいはアプリケーションでOracle Open Gatewayテクノロジを使用してOracle以外のデータベースと通信する場合は、ホスト変数を宣言するときに最大長を(18ではなく)256に指定してください。ホスト変数の内容については予測できませんが、ホスト変数はSQL文中で通常どおりに動作します。

DATE

DATEデータ型を使用して、日付と時刻を7バイトの固定長フィールドに格納します。表4-3に示すように、世紀、年、月、日、時(24時間制)、分および秒は、左から右にこの順序で格納されます。

表4-3 DATE書式

DATEデータ型 世紀 時間

バイト

1

2

3

4

5

6

7

意味

世紀

時間

1994年10月17日午後1時23分12秒

119

194

10

17

14

24

13

世紀と年を表すバイトは、100を加算した表記です。時間、分および秒は、1を加算した表記です。B.C.E.(西暦紀元前)の日付は99以下です。エポックは、紀元前4712年1月1日です。この日付の場合、世紀のバイトは53で、年のバイトは88です。時間のバイト範囲は1から24です。分と秒の範囲は、1から60です。時刻のデフォルトは、午前零時(1, 1, 1)です。

通常、DATEデータ型はほとんど使用されません。

RAW

RAWデータ型を使用して、バイナリ・データまたはバイト文字列を格納します。RAW値の最大長は65535バイトです。

RAWデータはCHARACTERデータに似ていますが、OracleではRAWデータは意味がないものと解釈され、システム間でRAWデータを転送するときにはキャラクタ・セットは変換されないという違いがあります。

VARRAW

VARRAWデータ型を使用して、可変長のバイナリ・データまたはバイト文字列を格納します。VARRAWデータ型はRAWデータ型に似ていますが、VARRAW変数は2バイトの長さフィールドの後に長さ65533バイト以下のデータ・フィールドが付いているという違いがあります。さらに長い文字列には、LONG VARRAWデータ型を使用してください。

VARRAW変数の長さを指定するときは、長さフィールド用の2バイトが含まれているかを確認してください。変数の最初の2バイトは、整数として解釈できる必要があります。

VARRAW変数の長さを取得するには、長さフィールドを参照してください。

LONG RAW

LONG RAWデータ型を使用して、バイナリ・データまたはバイト文字列を格納します。LONG RAW値の最大長は2147483647バイト、つまり2GBです。

LONG RAWデータはLONGデータと似ていますが、OracleではLONG RAWデータの意味は解釈されず、LONG RAWデータをあるシステムから別のシステムへ送信してもキャラクタ・セットは変換されません。

UNSIGNED

UNSIGNEDデータ型を使用して、符号なし整数を格納します。符号なし整数は、2バイトまたは4バイトの2進数です。ワード内のバイトの順序付けはシステムによって異なります。入力および出力ホスト変数に長さを指定する必要があります。出力時には、列値が浮動小数点数であれば、小数部が切り捨てられます。

LONG VARCHAR

LONG VARCHARデータ型を使用して、可変長文字列を格納します。LONG VARCHAR変数では、4バイトの長さフィールドに文字列フィールドが続きます。文字列フィールドの最大長は2147483643(2**31 - 5)バイトです。VAR文またはTYPE文に使用するLONG VARCHARの長さを指定する場合は、4バイトの長さフィールドを含めないでください。

LONG VARRAW

LONG VARRAWデータ型を使用して、可変長のバイナリ・データまたはバイト文字列を格納します。LONG VARRAW変数では、4バイトの長さフィールドにデータ・フィールドが続きます。データ・フィールドの最大長は2147483643バイトです。VAR文またはTYPE文に使用するLONG VARRAWの長さを指定する場合は、4バイトの長さフィールドを含めないでください。

CHAR

CHARデータ型は、固定長文字列の格納に使用します。CHAR値の最大長は65535バイトです。

入力時

Oracleでは、入力ホスト変数に指定されたバイト数を読み取り、後続の空白を切り捨てずに、ターゲット・データベース列に入力値を格納します。

入力値がデータベース列の定義より長い場合は、エラーが発生します。入力値がすべて空白の場合は、空白が文字値と同様に扱われます。

出力時

Oracleは出力ホスト変数に指定されたバイト数を戻し、必要に応じて空白埋込みを行ってから、出力値をターゲット・ホスト変数に割り当てます。NULLが戻されると、Oracleはホスト変数に空白文字を埋めます。

出力値がホスト変数の宣言長より長い場合、Oracleはホスト変数に割り当てる前に出力値を切り捨てます。標識変数が使用可能な場合、標識変数は出力値の元の長さに設定されます。明示的にNULLが選択された場合、ホスト変数の値は予測不能です。標識変数の値がNULLかどうかをチェックする必要があります。

CHARZ

DBMS=V7またはV8の場合、デフォルトでは、OracleはPro*C/C++プログラム内のすべての文字ホスト変数にCHARZデータ型を割り当てます。CHARZデータ型は、ヌル文字で終了する固定長文字列を示します。CHARZ値の最大長は65534バイトです。

入力時

CHARZデータ型とSTRINGデータ型の機能は同じです。入力値はNULL文字で終了する必要があります。ヌル終端文字は、文字列の区切り記号としての役割のみを果し、格納データの一部にはなりません。

出力時

CHARZホスト変数を必要に応じて空白文字で埋めて、ヌル文字で終了します。この出力値は、データが長すぎるために切捨てが必要な場合にも、常にヌル文字で終了します。明示的にNULLが選択された場合、ホスト変数の値は予測不能です。標識変数の値がNULLかどうかをチェックする必要があります。

CHARF

CHARFデータ型は、EXEC SQL TYPE文およびEXEC SQL VAR文で使用します。DBMSオプションをV7またはV8に設定してプリコンパイルするときに、TYPE文またはVAR文で外部データ型CHARを指定すると、C言語のデータ型、もしくは固定長でヌル文字で終了するデータ型であるCHARZに同値化されます。

ただし、これらの型に同値化するのではなく、固定長の外部型CHARに同値化することが必要な場合もあります。外部型CHARFを使用すると、C言語のデータ型または変数は、DBMS値に関係なく常に固定長のANSIデータ型CHARと同値化されます。CHARFによりC言語のデータ型がVARCHAR2またはCHARZと同値化されることはありません。そのかわり、CHAR_MAP=CHARFオプションを設定すると、char[n]またはcharとして宣言されたホスト変数はすべてCHAR文字列と同値化されます。明示的にNULLが選択された場合、ホスト変数の値は予測不能です。標識変数の値がNULLかどうかをチェックする必要があります。

その他の外部データ型

この項では、その他の外部データ型について説明します。

日時データ型および期間データ型

ここでは、日時および時間隔のデータ型の概要を説明します。

関連項目:

詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

ANSI DATE

ANSI DATEDATEに基づいていますが、時刻部分が含まれていません。(したがって、タイム・ゾーンも含まれていません。)ANSI DATEは、DATEデータ型のANSI仕様部の後に指定します。ANSI DATEDATEまたはタイムスタンプ・データ型に割り当てると、Oracle DATEの時間部分およびタイムスタンプがゼロに設定されます。DATEまたはタイムスタンプをANSI DATEに割り当てた場合、時間部分は無視されます。

このデータ型ではなく、日付および時刻が含まれているTIMESTAMPデータ型の使用をお薦めします。

TIMESTAMP

TIMESTAMPデータ型は、DATEデータ型の拡張です。DATEデータ型の年、月、日の他、時、分、秒の値が格納されます。タイム・ゾーンはありません。TIMESTAMPデータ型の書式は次のようになります。

TIMESTAMP(fractional_seconds_precision) 

fractional_seconds_precision(オプション)では、SECOND日時フィールドの小数部の桁数を指定します。桁数の範囲は0から9です。デフォルトは6です。

TIMESTAMPWITHTIMEZONE

TIMESTAMP WITH TIME ZONE (TSTZ)データ型はTIMESTAMPの改良型で、その値に明示的なタイム・ゾーン置換が含まれています。タイムゾーンによる時差は、地方時とUTC(協定世界時、旧称はグリニッジ標準時)との時差(時および分単位)です。TIMESTAMP WITH TIME ZONEデータ型の書式は次のとおりです。

TIMESTAMP(fractional_seconds_precision) WITH TIME ZONE

fractional_seconds_precision(オプション)では、SECOND日時フィールドの小数部の桁数を指定します。桁数の範囲は0から9です。デフォルトは6です。

2つのTIMESTAMP WITH TIME ZONEの値がUTCで同じ時刻を表している場合は、データに格納されているTIME ZONEオフセットに関係なく同一とみなされます。

TIMESTAMPWITHLOCALTIMEZONE

TIMESTAMP WITH LOCAL TIME ZONE (TSLTZ)データ型はTIMESTAMPの別の改良型で、その値にタイム・ゾーン置換が含まれています。格納される値の形式はTIMESTAMPと同じです。このデータ型とTIMESTAMP WITH TIME ZONEとの違いは、データベースに格納されるデータがデータベース・タイム・ゾーンに正規化されること、およびタイム・ゾーン置換が列データの一部として格納されないことです。ユーザーがデータを取り出すと、そのユーザーのローカル・セッション・タイム・ゾーンでデータが戻されます。

タイムゾーンによる時差は、地方時とUTC(協定世界時、旧称はグリニッジ標準時)との時差(時および分単位)です。TIMESTAMP WITH LOCAL TIME ZONEデータ型の書式は次のとおりです。

TIMESTAMP(fractional_seconds_precision) WITH LOCAL TIME ZONE

fractional_seconds_precision(オプション)では、SECOND日時フィールドの小数部の桁数を指定します。桁数の範囲は0から9です。デフォルトは6です。

INTERVALYEARTOMONTH

INTERVAL YEAR TO MONTHデータ型には、YEARおよびMONTH日時フィールドを使用した期間が格納されます。INTERVAL YEAR TO MONTHデータ型の書式は次のようになります。

INTERVAL YEAR(year_precision) TO MONTH

year_precision(オプション)には、YEAR日時フィールドの桁数を指定します。year_precisionのデフォルト値は2です。

INTERVALDAYTOSECOND

INTERVAL DAY TO SECONDデータ型には、日、時間、分および秒による期間が格納されます。INTERVAL DAY TO SECONDデータ型の書式は次のようになります。

INTERVAL DAY (day_precision) TO SECOND(fractional_seconds_precision)

説明:

  • day_precisionは、DAY日時フィールドの桁数です。これはオプションです。0から9までの値を使用できます。デフォルトは2です。

fractional_seconds_precisionは、SECOND日時フィールドの小数部の桁数です。これはオプションです。0から9までの値を使用できます。デフォルトは6です。

日時を使用する際の予期しない結果の回避

注意:

日時データのDML操作で正しい結果を得るには、組込みSQLファンクションDBTIMEZONEおよびSESSIONTIMEZONEで問い合せることによって、データベースおよびセッションのタイムゾーンを確認します。タイム・ゾーンが手動で設定されていない場合、デフォルトではオペレーティング・システムのタイム・ゾーンが使用されます。オペレーティング・システムのタイム・ゾーンがOracleで有効なタイム・ゾーンではない場合、UTCがデフォルト値として使用されます。