5 データ型

この章には、Oracle C++ Call Interfaceアプリケーションで使用するOracleデータ型のリファレンスが記載されています。この情報は、アプリケーションとデータベース・サーバー間におけるデータ転送時に発生する、データの内部表現と外部表現との間の変換を理解するのに役立ちます。

この章には次のトピックが含まれます:

Oracleデータ型の概要

C++プログラムとOracleデータベース・サーバー間では、通信を正確に行うことが重要です。OCCIアプリケーションでは、SQL問合せを使用してデータベース表からデータを取り出すか、SQLのINSERTUPDATEおよびDELETE関数を使用して既存のデータを変更できます。ホスト言語のC++とデータベース・サーバー間の通信を容易に行うには、C++データ型とOracleデータ型間の変換方法を理解する必要があります。

Oracleデータベースでは、値は表内の列に格納されています。Oracle内部では、データは内部データ型と呼ばれる特定フォーマットで表現されます。NUMBERVARCHAR2およびDATEなどは、このOracle内部データ型の例です。

OCCIアプリケーションでは、ホスト言語データ型、またはホスト言語によって事前定義された外部データ型を使用します。データがOCCIアプリケーションとデータベース・サーバーの間で移動する際、データベースのデータは、内部データ型から外部データ型に変換されます。

この項には、トピック「OCCI型とデータ変換について」が含まれています。

OCCI型とデータ変換について

OCCIでは、OCCIアプリケーションで利用可能なデータ表記フォーマットを列挙するTypeと呼ばれる列挙子が定義されています。それらの表記形式は、外部データ型と呼ばれます。データがOCCIアプリケーションからデータベース・サーバーに送信されると、外部データ型によってデータベース・サーバーはどの形式のデータを予想すべきかが示されます。OCCIアプリケーションによってデータベース・サーバーからデータを要求されると、戻されるデータの形式が外部データ型によって示されます。

たとえば、NUMBER列からの値の取得時に、プログラムはOCCIINT形式(符号付き整数フォーマットの整数値)でその値を取得するように設定できます。もしくは、クライアントは、NUMBER型の列に挿入されるC++のfloat型変数に格納されたOCCIFLOAT形式(浮動小数点形式)のデータを送信するように設定できます。

OCCIアプリケーションでは、setxxx()メソッド(外部データ型はメソッド名によって暗黙的に指定されます)をコールするか、registerOutParam()setDataBuffer()またはsetDataBufferArray()メソッド(外部データ型はメソッドのコールによって明示的に指定されます)をコールして、入力パラメータをStatementにバインドします。同様に、データ値がResultSetオブジェクトを使用してフェッチされた場合は、取り出したデータの外部表現を指定する必要があります。この指定は、getxxx()メソッド(外部データ型はメソッド名によって暗黙的に指定されます)をコールするか、setDataBuffer()メソッド(外部データ型はメソッドのコールによって明示的に指定されます)をコールして行います。

外部データ型は、内部データ型より多くあります。単一の外部データ型が単一の内部データ型にマップされる場合や、多数の外部データ型が単一の内部データ型にマップされる場合があります。この多対1のマッピングによって、柔軟性が向上します。

関連項目:

外部データ型

内部データ型

この項では、Oracleが提供する内部(組込み)データ型について説明します。説明、コード、最大サイズなど、Oracle内部データ型の概要は、表5-1を参照してください。

表5-1 Oracle内部データ型の概要

内部データ型 最大サイズ
BFILE

4GB

BINARY_DOUBLE

8バイト

BINARY_FLOAT

4バイト

CHAR

2,000バイト

DATE

7バイト

INTERVAL DAY TO SECOND REF

11バイト

INTERVAL YEAR TO MONTH REF

5バイト

LONG

2GB (2^31-1バイト)

LONG RAW

2GB (2^31-1バイト)

NCHAR

2,000バイト

NUMBER

21バイト

NVARCHAR2

32,767バイト

RAW

2000バイト(標準)、32,767バイト(拡張)

REF

該当なし

BLOB

4GB

CLOB

4GB

NCLOB

4GB

ROWID

10バイト

TIMESTAMP

11バイト

TIMESTAMP WITH LOCAL TIME ZONE

7バイト

TIMESTAMP WITH TIME ZONE

13バイト

UROWID

4000バイト

ユーザー定義型(オブジェクト型、VARRAY、nested table)

該当なし

VARCHAR2

4000バイト(標準)、32,767バイト(拡張)

文字列およびバイト配列

文字またはバイト配列を含む列を指定する場合は、CHARVARCHAR2RAWLONGおよびLONG RAWの5つのOracle内部データ型を使用できます。

通常、CHAR列、VARCHAR2列およびLONG列には文字データが入ります。RAWLONG RAWは、ビットマップ化された画像のピクセル値など、文字として解釈されないバイトを保持します。文字データは、ネットワーク間のゲートウェイを介して渡すと、変形する可能性があります。たとえば、異なる言語(単一の文字が異なるバイト数で表現される)を使用しているシステム間で文字データを渡すと、データの長さが大幅に変更される可能性があります。RAWデータがこのように変換されることはありません。

適切なOracle内部データ型を表内の各列に対して選択するのは、データベース設計者の役割です。文字データとバイト配列データを表現する方法、およびOCCIプログラムの変数とOracleデータベース表間でデータを変換する方法には、様々な方法があることを理解しておく必要があります。

ユニバーサルROWID(UROWID)

ユニバーサルROWID (UROWID)は、Oracle表、およびゲートウェイを使用してアクセスするDB2表などの外部キー表の行に対する論理ROWIDと物理ROWIDを格納できるデータ型です。論理ROWIDの値は、索引構成表の行に対する主キー・ベースの論理識別子です。

UROWIDデータ型の列を使用するには、COMPATIBLE初期化パラメータの値を8.1以上に設定する必要があります。

次のOCCI_SQLT型は、ユニバーサルROWIDにバインドできます。

  • OCCI_SQLT_CHR(VARCHAR2)

  • OCCI_SQLT_VCS(VARCHAR)

  • OCCI_SQLT_STR (NULL終了文字列)

  • OCCI_SQLT_LVC (long VARCHAR)

  • OCCI_SQLT_AFC(CHAR)

  • OCCI_SQLT_AVC(CHARZ)

  • OCCI_SQLT_VST (文字列)

  • OCCI_SQLT_RDD (ROWID記述子)

外部データ型

OCCIアプリケーションは、外部データ型を使用してOracleデータベース・サーバーと通信します。具体的には、外部データ型がC++データ型にマップされます。

表5-2は、Oracle外部データ型、等価のC++データ型(Oracle内部データ型からの通常の変換先)および対応するOCCI型を示しています。次の条件に注意してください。

  • C++データ型列では、nは変数長を表し、プログラム要件またはオペレーティング・システムに依存します。

  • Statementクラスのメソッドにおける型の使用方法は次のとおりです。

    • setDataBuffer()およびsetDataBufferArray(): occiCommon.hファイルのOCCI_SQLT_xxxフォーム(OCCI_SQLT_INTなど)のデータ型のみ使用できます。

    • registerOutParam(): occiCommon.hファイルのOCCIxxxフォーム(OCCIDOUBLEOCCICURSORなど)のデータ型のみ使用できます。ただし、いくつか例外があります。OCCIANYDATAOCCIMETADATAOCCISTREAMおよびOCCIBOOLは使用できません。

  • ResultSetクラスでは、occiCommon.hファイルのOCCI_SQLT_xxxフォーム(OCCI_SQLT_INTなど)のデータ型のみが、setDataBuffer()およびsetDataBufferArray()メソッドで使用できます。

  • TIMESTAMPデータ型とTIMESTAMP WITH TIME ZONEデータ型は、総称して日時データ型と呼ばれています。INTERVAL YEAR TO MONTHデータ型とINTERVAL DAY TO SECONDデータ型は、総称して間隔データ型と呼ばれています。

表5-2 外部データ型と対応するC++型およびOCCI型

外部データ型 C++型 OCCI型 使用上の注意

16ビット符号付きINTEGER

signed short, signed int
OCCIINT

setDataBuffer()setDataBufferArray()で使用します。

32ビット符号付きINTEGER

signed int, signed long
OCCIINT

setDataBuffer()setDataBufferArray()で使用します。

8ビット符号付きINTEGER

signed char
OCCIINT

setDataBuffer()setDataBufferArray()で使用します。

BFILE

Bfile
OCCIBFILE

regiserOutParam()で使用します。

FBFILE

OCILobLocator
OCCI_SQLT_FILE

setDataBuffer()setDataBufferArray()で使用します。

BLOB

OCILobLocator
OCCI_SQLT_BLOB

setDataBuffer()setDataBufferArray()で使用します。

BLOB

Blob
OCCIBLOB

regiserOutParam()で使用します。

BOOL

bool
OCCIBOOL

regiserOutParam()で使用します。

BYTES

Bytes
OCCIBYTES

regiserOutParam()で使用します。

CHAR

char[n]
OCCI_SQLT_AFC

setDataBuffer()setDataBufferArray()で使用します。

CHAR

string
OCCICHAR

regiserOutParam()で使用します。

CLOB

OCILobLocator
OCCI_SQLT_CLOB

setDataBuffer()setDataBufferArray()で使用します。

CHARZ

char[n+1]
OCCI_SQLT_RDD

setDataBuffer()setDataBufferArray()で使用します。

CLOB

Clob
OCCICLOB

regiserOutParam()で使用します。

CURSOR

ResultSet
OCCICURSOR

regiserOutParam()で使用します。

DATE

char[7]
OCCI_SQLT_DAT

setDataBuffer()setDataBufferArray()で使用します。

DATE

Date
OCCIDATE

regiserOutParam()で使用します。

DOUBLE

double
OCCIDOUBLE

regiserOutParam()で使用します。

FLOAT

float, double
OCCIFLOAT

setDataBuffer()setDataBufferArray()で使用します。

FLOAT

float
OCCIFLOAT

regiserOutParam()で使用します。

INT

int
OCCIINT

regiserOutParam()で使用します。

INTERVALDAYTOSECOND

char[11]
OCCI_SQLT_INTERVAL_DS

setDataBuffer()setDataBufferArray()で使用します。

INTERVALYEARTOMONTH

char[5]
OCCI_SQLT_INTERVAL_YM

setDataBuffer()setDataBufferArray()で使用します。

INTERVALDS

IntervalDS
OCCIINTERVALDS

regiserOutParam()で使用します。

INTERVALYM

IntervalYM
OCCIINTERVALYM

regiserOutParam()で使用します。

LONG

char[n]
OCCI_SQLT_LNG

setDataBuffer()setDataBufferArray()で使用します。

LONG RAW

unsigned char[n]
OCCI_SQLT_LBI

setDataBuffer()setDataBufferArray()で使用します。

LONG VARCHAR

char[n+siezeof(integer)]
OCCI_SQLT_LVC

setDataBuffer()setDataBufferArray()で使用します。

LONG VARRAW

unsigned char[n+siezeof(integer)]
OCCI_SQLT_LVB

setDataBuffer()setDataBufferArray()で使用します。

METADATA

MetaData
OCCIMETADATA

regiserOutParam()で使用します。

NAMED DATA TYPE

struct
OCCI_SQLT_NTY

setDataBuffer()setDataBufferArray()で使用します。

NATIVE DOUBLE

double
OCCIBDOUBLE

setDataBuffer()setDataBufferArray()で使用します。

NATIVE DOUBLE

Bdouble, double
OCCIBDOUBLE

regiserOutParam()で使用します。

NATIVE FLOAT

float
OCCIBFLOAT

setDataBuffer()setDataBufferArray()で使用します。

NATIVE FLOAT

BFloat, float
OCCIBFLOAT

regiserOutParam()で使用します。

NULLで終了するSTRING

char[n+1]
OCCI_SQLT_STR

setDataBuffer()setDataBufferArray()で使用します。

NUMBER

unsigned char[21]
OCCI_SQLT_NUM

setDataBuffer()setDataBufferArray()で使用します。

NUMBER

Number
OCCINUMBER

regiserOutParam()で使用します。

POBJECT

OTTユーティリティによって生成されたユーザー定義型

OCCIPOBJECT

regiserOutParam()で使用します。

RAW

unsigned char[n]
OCCI_SQLT_BIN

setDataBuffer()setDataBufferArray()で使用します。

REF

OCIRef
OCCI_SQLT_REF

setDataBuffer()setDataBufferArray()で使用します。

REF

Ref
OCCIREF

regiserOutParam()で使用します。

REFANY

RefAny
OCCIREFANY

regiserOutParam()で使用します。

ROWID

OCIRowid
OCCI_SQLT_RID

setDataBuffer()setDataBufferArray()で使用します。

ROWID

Bytes
OCCIROWID

regiserOutParam()で使用します。

ROWID記述子

OCIRowid
OCCI_SQLT_RDD

setDataBuffer()setDataBufferArray()で使用します。

STRING

STL string
OCCISTRING

regiserOutParam()で使用します。

TIMESTAMP

char[11]
OCCI_SQLT_TIMESTAMP

setDataBuffer()setDataBufferArray()で使用します。

TIMESTAMP

Timestamp
OCCITIMESTAMP

regiserOutParam()で使用します。

TIMESTAMPWITHLOCALTIMEZONE

char[7]
OCCI_SQLT_TIMESTAMP_LTZ

setDataBuffer()setDataBufferArray()で使用します。

TIMESTAMPWITHTIMEZONE

char[13]
OCCI_SQLT_TIMESTAMP_TZ

setDataBuffer()setDataBufferArray()で使用します。

UNSIGNED INT

unsigned int
OCCIUNSIGNED_INT

setDataBuffer()setDataBufferArray()で使用します。

UNSIGNED INT

unsigned int
OCCIUNSIGNED_INT

regiserOutParam()で使用します。

VARCHAR

char[n+sizeof( short integer)]
OCCI_SQLT_VCS

setDataBuffer()setDataBufferArray()で使用します。

VARCHAR2

char[n]
OCCI_SQLT_CHR

setDataBuffer()setDataBufferArray()で使用します。

VARNUM

char[22]
OCCI_SQLT_VNU

setDataBuffer()setDataBufferArray()で使用します。

VARRAW

unsigned char[n+sizeof( short integer)]
OCCI_SQLT_VBI

setDataBuffer()setDataBufferArray()で使用します。

VECTOR

STL vector
OCCIVECTOR

regiserOutParam()で使用します。

この項には次のトピックが含まれます: 「外部データ型の説明」

外部データ型の説明

BFILE

BFILE外部データ型を使用すると、データベース・サーバーのファイル・システムにあるファイルに読取り専用バイト・ストリームによるアクセスが可能となります。BFILEは、オペレーティング・システム・ファイル内のデータベース表領域外に格納されているバイナリ・データのラージ・オブジェクトです。このファイルでは、参照セマンティクスが使用されます。OracleサーバーからBFILEにアクセスする場合は、基礎となるサーバーのオペレーティング・システムが、ストリームモードによるこれらのオペレーティング・システム・ファイルへのアクセスをサポートしている必要があります。

BDOUBLE

OCCIのBDoubleインタフェースは、システム固有のdouble型データ、およびbinary_double型の列またはオブジェクト属性のNULL情報をカプセル化します。AnyDataクラスResultSetクラス、およびStatementクラスのOCCIメソッド、およびこれらのクラス・オブジェクトをパラメータとして取るグローバル・メソッドは、BDOUBLEデータ型に対して次の定義を使用します。

例5-1 BDOUBLEデータ型の定義

struct BDouble 
{ 
  double value; 
  bool isNull; 
 
 BDouble() 
 { 
    isNull = false; 
    value = 0.; 
 } 
}; 
BFLOAT

OCCIのBFloatインタフェースは、システム固有のfloat型データ、およびbinary_float型の列またはオブジェクト属性のNULL情報をカプセル化します。AnyDataクラスResultSetクラス、およびStatementクラスのOCCIメソッド、およびこれらのクラス・オブジェクトをパラメータとして取るグローバル・メソッドは、BFLOATデータ型に対して次の定義を使用します。

例5-2 BFLOATデータ型の定義

struct BFloat 
{ 
  float value; 
  bool isNull; 
 
 BFloat() 
 { 
    isNull = false; 
    value = 0.; 
 } 
}; 
BLOB

BLOB外部データ型には、非構造化バイナリ・ラージ・オブジェクトが格納されます。BLOBは、キャラクタ・セットのセマンティクスを伴わないビットストリームとみなすこともできます。BLOBには、最大4GBのバイナリ・データを格納できます。

BLOBデータ型には、完全なトランザクション・サポートがあります。OCCIを使用して行われた変更は、すべてトランザクションに反映されます。BLOB値に対して行った操作は、コミットまたはロールバックできます。1つのトランザクション内で変数のBLOBロケータを保存し、次にそれを別のトランザクションまたはセッションで使用することはできません。

CHAR

CHAR外部データ型は、最大2000文字の文字列です。文字列は、空白埋めの比較方法を使用して比較されます。

CHARZ

CHARZ外部データ型は、入力時に文字列がNULL文字で終了していること、および出力時にOracleによって文字列の最後にNULL終端文字が配置されることを除けば、CHARデータ型と同じです。NULL終了文字列は入出力時に文字列を区切るためのものです。表のデータの一部ではありません。

CLOB

CLOB外部データ型には、固定幅または可変幅の文字データが格納されます。CLOBには、最大4GBの文字データを格納できます。CLOBには、完全なトランザクション・サポートがあります。OCCIを使用して行われた変更は、すべてトランザクションに反映されます。CLOB値に対して行った操作は、コミットまたはロールバックできます。1つのトランザクション内で変数のCLOBロケータを保存し、次にそれを別のトランザクションまたはセッションで使用することはできません。

DATE

DATE外部データ型は、表5-3に示すように、7バイトで構成されたOracle内部日付2進形式を使用して、日付の値の更新、挿入または取出しができます。

表5-3 DATEデータ型の書式

バイト1: 世紀 バイト2: 年 バイト3: 月 バイト4: 日 バイト5: 時間 バイト6: 分 バイト7: 秒

1: 01-JUN-2000, 3:17PM

120

100

6

1

16

18

1

2: 01-JAN-4712 BCE

53

88

1

1

1

1

1

例1: 2000年6月1日午後3時17分
  • 世紀と年を表すバイト(1と2)は、100を加算した表記です。BCE (西暦紀元前)の日付は99以下です。西暦0以降の日付は100以上になります。0以降の日付の場合、バイト1とバイト2の先頭の数字は、西暦であることを示します。

  • バイト1では、世紀の2番目と3番目の数字は、年(整数)を100で除算して計算されます。整数除算による小数部分は切り捨てられます。1992年については、1992 / 100 = 19という計算が行われます。

  • バイト1の場合、119は、20世紀(1900から1999)を表します。120の値は、21世紀(2000から2099)を表すことになります。

  • バイト2では、年の2番目と3番目の数字が年のモジュロ100として、1992 % 100 = 92のように計算されます。

  • バイト2の場合、192は、現在の世紀の92番目の年を表します。100の値は、現在の世紀の0番目の年を表すことになります。

  • 西暦2000年は、バイト1が120、バイト2が100で表されます。

  • バイト3から7では、有効な日付はその年の1月1日から開始します。月バイトの範囲は1から12、日付バイトの範囲は1から31、時間バイトの範囲は1から24、分バイトの範囲は1から60、秒バイトの範囲は1から60となります。

例2: BCE 4712年1月1日
  • 西暦0以前の年数の場合、世紀数と年数は、100とその年数との差異で表されます。

  • バイト1では、BCE 4712年1月1日は53世紀(100 - 47 = 53)になります。

  • バイト2では、BCE 4712年1月1日は88年(100 - 12 = 88)になります。

日付に時刻が指定されていない場合、時刻はデフォルトで深夜となり、バイト5から6は1 (111)に設定されます。

DATE外部データ型を使用して、日付を2進形式で入力する場合、データベースでは一貫性または範囲のチェックが行われません。この形式によるデータは、入力前にすべて検証する必要があります。

DATE外部データ型が必要となることはほとんどありません。ほとんどのプログラムでは、DD-MON-YYYYなどの文字形式で日付が処理されるため、DATEの値を文字形式に変換する方が便利です。かわりに、Dateデータ型を使用できます。

DATEの列がプログラム内で文字列に変換されると、その列は使用中セッションのデフォルトの書式マスクで戻されるか、またはINIT.ORAファイルで指定したとおりに戻されます。

このデータ型は、C++のDateデータ型に対応するOCCI DATEとは異なります。

FLOAT

FLOAT外部データ型は、小数部分のある数値を処理します。数値はホスト・システムの浮動小数点書式で表されます。通常、長さは4バイトか8バイトです。

Oracleの数値の内部形式は10進数です。ほとんどの浮動小数点は2進数です。したがって、Oracleでは、浮動小数点による表現より高い精度で数値が表されます。

INTEGER

INTEGER外部データ型は、数値の変換に使用されます。外部INTEGERは符号付きの2進数です。サイズは、オペレーティング・システムによって異なります。Oracleから戻される数値が整数でない場合は、小数部分が切り捨てられ、エラーは戻りません。戻された数値がシステムの符号付き整数より大きくて表現できない場合は、変換時のオーバーフロー・エラーが戻されます。

FLOATNUMBER間の変換時に、丸めのエラーが発生する場合があります。問合せでFLOATをバインド変数として使用すると、エラーが戻る場合があります。この問題を回避するには、FLOATを文字列に変換し、操作では、OCCI型のOCCI_SQLT_CHRまたはOCCI型のOCCI_SQLT_STRを使用します。

INTERVAL DAY TO SECOND

INTERVAL DAY TO SECOND外部データ型には、日数、時間数、分数および秒数に関して、2つの日時の値の差異が格納されます。このデータ型は次のように指定します。

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

この例では、次のプレースホルダが使用されています。

  • day_precision: DAY日時フィールドの桁数。有効な値は、1から9です。デフォルト値は2です。

  • fractional_seconds_precision: SECOND日時フィールドの小数部分の桁数。有効な値は、0から9です。デフォルト値は6です。

INTERVAL DAY TO SECONDリテラルをデフォルト以外の日付と秒の精度で指定するには、このリテラル内に精度を指定する必要があります。たとえば、次のように、100日、10時間、20分、42秒と22/100秒の間隔を指定できます。

INTERVAL '100 10:20:42.22' DAY(3) TO SECOND(2)

また、INTERVAL DAY TO SECONDリテラルの省略フォームも使用できます。たとえば、次のようにします。

  • INTERVAL '90' MINUTEは、INTERVAL '00 00:90:00.00' DAY TO SECOND(2)にマップされます。

  • INTERVAL '30:30' HOUR TO MINUTEは、INTERVAL '00 30:30:00.00' DAY TO SECOND(2)にマップされます。

  • INTERVAL '30' SECOND(2,2) は、INTERVAL '00 00:00:30.00' DAY TO SECOND(2)にマップされます。

INTERVAL YEAR TO MONTH

INTERVAL YEAR TO MONTH外部データ型には、YEARMONTHの日時フィールドを使用して、2つの日時の値の差異が格納されます。INTERVAL YEAR TO MONTHは、次のように指定します。

INTERVAL YEAR [(year_precision)] TO MONTH

プレースホルダyear_precisionは、YEAR日時フィールドの桁数です。year_precisionのデフォルト値は2です。INTERVAL YEAR TO MONTHリテラルをデフォルト以外のyear_precisionで指定するには、このリテラル内に精度を指定する必要があります。たとえば、次のINTERVAL YEAR TO MONTHリテラルは、1232か月の間隔を示しています。

INTERVAL '123-2' YEAR(3) TO MONTH

また、INTERVAL YEAR TO MONTHリテラルの省略フォームも使用できます。次に例を示します。

  • INTERVAL '10' MONTHは、INTERVAL '0-10' YEAR TO MONTHにマップされます。

  • INTERVAL '123' YEAR(3)は、INTERVAL '123-0' YEAR(3) TO MONTHにマップされます。

LONG

LONG外部データ型には、LONGデータ型の列に4001バイト以上、2GBまでの文字列が格納されます。この型の列は、長い文字列の格納と取出しにのみ使用されます。メソッド、式またはWHERE句では使用できません。一般的に、LONG列値の変換は、文字列との間で行われます。

LONG RAW

LONG RAW外部データ型は、最大2GBのデータを格納できることを除けば、RAW外部データ型と同じです。

LONG VARCHAR

LONG VARCHAR外部データ型には、OracleのLONG列へのデータおよびこの列からのデータが格納されます。先頭の4バイトには、項目の長さが記述されます。LONG VARCHARの最大長は2GBです。

LONG VARRAW

LONG VARRAW外部データ型には、OracleのLONG RAW列へのデータおよびこの列からのデータが格納されます。長さは、先頭の4バイトに記述されます。最大長は2GBです。

NCLOB

NCLOB外部データ型は、CLOBの各国語キャラクタ・バージョンです。この外部データ型には、マルチバイトで固定幅の各国語キャラクタ・セットのキャラクタ(NCHAR)または可変幅キャラクタ・セットのデータが格納されます。NCLOBには、最大4GBの文字テキスト・データを格納できます。

NCLOBには、完全なトランザクション・サポートがあります。OCCIを使用して行われた変更は、すべてトランザクションに反映されます。NCLOB値に対して行った操作は、コミットまたはロールバックできます。1つのトランザクション内で変数にNCLOBロケータを保存し、次にそれを別のトランザクションまたはセッションで使用することはできません。

NCLOB属性を指定してオブジェクトを作成することはできませんが、メソッドでNCLOBパラメータを指定することは可能です。

NUMBER

NUMBERを外部データ型として使用する必要はほとんどありません。これを使用すると、Oracleでは21バイトの内部2進形式で数値を戻し、入力時にこの形式が必要になります。完全な情報が必要な場合は、次の説明を参照してください。

Oracleでは、NUMBERデータ型の値が可変長形式で格納されます。最初のバイトは指数部であり、その後に1バイトから20バイトの仮数部が続きます。指数バイトの上位1ビットは符号ビットですが、正数の場合にセットされ、負数の場合にクリアされます。下位7ビットは指数を表しています。100の位を底とし、オフセットは65です。

10進数の指数を計算するには、基本100の指数に65を加算し、数値が正数の場合はさらに128を加算します。数値が負数の場合も同様に計算しますが、後でビットが反転されます。たとえば、-5の場合は、基本100の指数 = 62 (0x3e)になります。したがって、10進数の指数は、(~0x3e)-128-65 = 0xc1-128-65 = 193-128-65 = 0になります。

各仮数バイトは基本100で範囲1から100の数字です。正数の場合は、それに1を加算した数字となります。したがって、値5に対する仮数は6です。負数の場合は、1を加算するかわりに、その数字が101から減算されます。つまり、数値-5に対する仮数は、101-5 = 96となります。負数には、102が含まれているバイトがデータ・バイトの後に追加されます。ただし、20個の仮数バイトを持つ負数には、102のバイトは後続しません。仮数バイトは基本100であるため、各バイトは2桁の10進数値を表すことができます。仮数は正規化され、先行する0 (ゼロ)は格納されません。

仮数を表すために最大20個のデータ・バイトを使用できます。ただし、精度が保証されているのは19個のみです。19個のデータ・バイトは、それぞれ基本100を表し、NUMBER内部データ型に対して38桁の最大精度を提供します。

このデータ型は、C++のNumberデータ型に対応するOCCI NUMBERとは異なります。

OCCI STRING

OCCI STRING外部データ型は、STL String型に対応しています。

OCCI VECTOR

OCCI VECTOR外部データ型は、ネストした表やVARRAYなどのコレクションを表すために使用されます。CREATE TYPE num_type as VARRAY OF NUMBER(10)は、C++アプリケーションではvector<int>vector<Number>として表すことができます。

RAW

RAW外部データ型は、Oracleで解釈または処理されないバイナリ・データやバイト列で使用されます。たとえば、RAWは図形の文字列で使用できます。RAW列の最大長は2000バイトです。init.oraのパラメータがmax_string_size = standard (デフォルト値)の場合、RAWの最大の長さは2000バイトです。init.oraのパラメータがmax_string_size = extendedの場合、RAWの最大の長さは32767バイトです。拡張データ型の詳細は、『Oracle Databaseリファレンス』init.oraのパラメータMAX_STRING_SIZEに関する項を参照してください。

Oracle表内のRAWデータが文字列に変換される場合、データは16進コードで表されます。RAWデータの各バイトは、それぞれの値を示す00からFFの範囲の2文字で表されます。RAWを使用して文字列を入力する場合は、16進コードを使用する必要があります。

REF

REF外部データ型は、名前付きデータ型に対する参照です。アプリケーションで使用するためにREFを割り当てるには、REFへのポインタとして変数を宣言します。

ROWID

ROWID外部データ型は、データベース表内の特定の行を識別します。多くの場合、ROWIDは次の例にあるような文の発行による問合せで戻されます。

SELECT ROWID, var1, var2 FROM db;

戻されたROWIDは、後続のDELETE文で使用できます。

UPDATE操作でSELECTを実行する場合は、ROWIDが暗黙的に戻されます。

STRING

STRING外部データ型は、VARCHAR2外部データ型(データ型コード1)のように動作します。ただし、STRING外部データ型は、NULLで終了する必要があります。

このデータ型は、C++ STL文字列データ型に対応するOCCI STRINGとは異なります。

TIMESTAMP

TIMESTAMP外部データ型は、DATEデータ型の拡張機能です。DATEデータ型の年、月および日に加えて、時、分および秒の値を格納します。TIMESTAMPデータ型は次のように指定します。

TIMESTAMP [(fractional_seconds_precision)] 

プレースホルダfractional_seconds_precisionでは、必要に応じて、SECOND日時フィールドの小数部分の桁数を0から9の範囲で指定します。デフォルトは6です。たとえば、次のようにTIMESTAMP(2)をリテラルとして指定します。

TIMESTAMP '1997-01-31 09:26:50.10'

このデータ型は、OCCI TIMESTAMPとは異なります。

TIMESTAMPWITHLOCALTIMEZONE

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オフセットにかかわらず、同一であるとみなされます。

TIMESTAMPWITHTIMEZONE

TIMESTAMP WITH TIME ZONE外部データ型はTIMESTAMPの改良型で、その値にタイム・ゾーン置換が含まれています。タイム・ゾーン置換は、現地時間とUTC (協定世界時、以前はグリニッジ標準時)との差異(時分による)です。TIMESTAMP WITH TIME ZONEデータ型は、次のように指定します。

TIMESTAMP [(fractional_seconds_precision)] WITH TIME ZONE

プレースホルダfractional_seconds_precisionでは、必要に応じて、SECOND日時フィールドの小数部分の桁数を0から9の範囲で指定します。デフォルト値は6です。たとえば、次のようにTIMESTAMP(0) WITH TIME ZONEをリテラルとして指定します。

TIMESTAMP '1997-01-31 09:26:50+02.00'
UNSIGNED INT

UNSIGNED INT外部データ型は、符号なし2進整数に対して使用されます。バイト単位のサイズは、オペレーティング・システムによって異なります。ワード内のバイトの順序は、ホスト・システムのアーキテクチャによって決まります。Oracleから出力される数値が整数でない場合は、小数部分が切り捨てられ、エラーは戻りません。戻される数値が、オペレーティング・システムの符号なし整数より大きくて表現できない場合は、変換時のオーバーフロー・エラーが戻されます。

VARCHAR

VARCHAR外部データ型には、可変長の文字列が格納されます。先頭の2バイトには文字列の長さが記述され、残りのバイトには実際の文字列が含まれます。バインドまたは定義コールで指定する文字列の長さには、この2バイトを含める必要があるため、VARCHAR文字列の最大長は、65535バイトではなく、65533バイトになります。これより長い文字列を変換する場合は、LONG VARCHAR外部データ型を使用します。

VARCHAR2

VARCHAR2外部データ型は、最大4000バイトの可変長文字列です。init.oraのパラメータがmax_string_size = standard (デフォルト値)の場合、VARCHAR2の最大の長さは4000バイトです。init.oraのパラメータがmax_string_size = extendedの場合、VARCHAR2の最大の長さは32767バイトです。拡張データ型の詳細は、『Oracle Databaseリファレンス』init.oraのパラメータMAX_STRING_SIZEに関する項を参照してください。

VARNUM

VARNUM外部データ型は、最初のバイトに数値表現の長さが含まれることを除けば、NUMBER外部データ型と同じです。この長さを示す値には、長さを記述するバイト自体は含まれません。最大長のVARNUMに備えて、22バイトを確保してください。VARNUMの値をデータベースに送信するときは、長さを記述するバイトを設定する必要があります。

表5-4 VARNUMの例

10進数 長さバイト 指数バイト 仮数バイト 終了文字バイト

0

1

128

NA脚注1

NA

5

2

193

6

NA

-5

3

62

96

102

2767

3

194

28, 68

NA

-2767

4

61

74, 34

102

100000

2

195

11

NA

1234567

5

196

2, 24, 46, 68

NA

脚注 1

NAは、該当なしを意味します。

VARRAW

VARRAW外部データ型は、最初の2バイトにデータの長さを記述することを除けば、RAW外部データ型と同じです。バインドまたは定義コールで指定する文字列の長さには、この2バイトが含まれている必要があります。したがって、送受信可能なVARRAW文字列の最大長は、65535バイトではなく、65533バイトになります。これより長い文字列を変換する場合は、LONG VARRAWデータ型を使用します。

NATIVE DOUBLE

この外部データ型には、IEEE 754規格の標準倍精度浮動小数点データ型が実装されています。これは、ホスト・システムのネイティブの浮動小数点形式で表されます。このデータ型はバイト互換性のある標準形式でOracle Serverに格納されますが、それにはデータ長バイトを含めて8バイト必要です。これはOracle NUMBERの代替であり、NUMBERに対して次のような利点を持っています。

  • 格納に使用するバイト数が少なくて済みます。

  • RDBMSクライアントで使用されるデータ型と一致します。

  • 科学計算で使用される様々な値をサポートします。

NATIVE FLOAT

この外部データ型には、IEEE 754の単精度浮動小数点データ型が実装されています。これは、ホスト・システムのネイティブの浮動小数点形式で表されます。このデータ型はバイト互換性のある標準形式でOracle Serverに格納されますが、それにはデータ長バイトを含めて4バイト必要です。これはOracle NUMBERの代替であり、NUMBERに対して次のような利点を持っています。

  • 格納に使用するバイト数が少なくて済みます。

  • RDBMSクライアントで使用されるデータ型と一致します。

  • 科学計算で使用される様々な値をサポートします。

データ変換

表5-5は、サポートされている、Oracle内部データ型から外部データ型への変換、および外部データ型から列の内部表現への変換を示しています。

次の条件に注意してください。

  • データベースに格納されているREFは、出力時にOCCI_SQLT_REFに変換されます。

  • OCCI_SQLT_REFは、入力時にREFの内部表現に変換されます。

  • データベースに格納されている名前付きデータ型は、出力時にOCCI_SQLT_NTY (アプリケーション内ではC構造体で表現されます)に変換されます。

  • OCCI_SQLT_NTY (アプリケーション内ではC構造体で表現されます)は、入力時に、対応するデータ型の内部表現に変換されます。

  • LOBとBFILEは、OCCIアプリケーション内では記述子で表現されるため、入出力時の変換はありません。

表5-5に示したように、変換には次の数値コードがあります。

  1. データ型は、入力時にはOracle ROWID形式である必要があります。出力時は、Oracle ROWID形式で戻されます。

  2. データ型は、入力時にはOracle DATE形式である必要があります。出力時は、Oracle DATE形式で戻されます。

  3. データ型は、入力時には16進フォーマットである必要があります。出力時は、16進フォーマットで戻されます。

  4. データ型は、出力時には有効な数値を表している必要があります。

  5. 長さは2000文字以下であることが必要です。

  6. データ型は、出力時には16進フォーマットで格納される必要があります。出力時は16進フォーマットです。

表5-5 外部データ型と内部データ型間のデータ変換

NA(2) 内部データ型
外部データ型 VARCHAR2 NUMBER LONG ROWID DATE RAW LONG RAW CHAR BFLOAT BDOUBLE

CHAR

I/O

I/O

I/O

I/O1

I/O2

I/O3

I3、5

I/O

I/O

I/O

CHARZ

I/O

I/O

I/O

I/O1

I/O2

I/O3

I3、5

I/O

NA

NA

DATE

I/O

NA

I

NA

I/O

NA

NA

I/O

NA

NA

DECIMAL

I/O4

I/O

I

NA

NA

NA

NA

I/O4

NA

NA

FLOAT

I/O4

I/O

I

NA

NA

NA

NA

I/O4

I/O

I/O

INTEGER

I/O4

I/O

I

NA

NA

NA

NA

I/O4

I/O

I/O

LONG

I/O

I/O

I/O

I/O1

I/O2

I/O3

I/O3、5

I/O

I/O

II/O

LONG RAW

O6

NA

I5、6

NA

NA

I/O

I/O

O6

NA

NA

LONG VARCHAR

I/O

I/O

I/O

I/O1

I/O2

I/O3

I/O3、5

I/O

I/O

I/O

LONG VARRAW

I/O6

NA

I5、6

NA

NA

I/O

I/O

I/O6

NA

NA

NUMBER

I/O4

I/O

I

NA

NA

NA

NA

I/O4

I/O

I/O

OCCI BDouble

I/O

1/O

I

NA

NA

NA

NA

I/O

I/O

I/O

OCCI BFloat

I/O

1/O

I

NA

NA

NA

NA

I/O

I/O

I/O

OCCI Bytes

I/O6

NA

I5、6

NA

NA

I/O

I/O

I/O6

NA

NA

OCCI Date

I/O脚注3

NA

I

NA

I/O

NA

NA

I/O

NA

NA

OCCI Number

I/O4

I/O

I

NA

NA

NA

NA

I/O4

I/O

I/O

OCCI Timestamp

NA

NA

NA

NA

NA

NA

NA

NA

NA

NA

RAW

I/O6

NA

I5、6

NA

NA

I/O

I/O

I/O6

NA

NA

ROWID

I

NA

I

I/O

NA

NA

NA

[I]

NA

NA

STL string

I/O

I/O

I/O

I/O1

I/O2

I/O3

I/O3

-

I/O4

I/O4

STRING

I/O

I/O

I/O

I/O1

I/O2

I/O3

I/O3、5

I/O

I/O

I/O

UNSIGNED

I/O4

I/O

I

NA

NA

NA

NA

I/O4

I/O

I/O

VARCHAR

I/O

I/O

I/O

I/O1

I/O2

I/O3

I/O3

NA

I/O

I/O

VARCHAR2

I/O

I/O

I/O

I/O1

I/O2

I/O3

I/O3、5

I/O

I/O

I/O

VARNUM

I/O4

I/O

I

NA

NA

NA

NA

I/O4

I/O

I/O

VARRAW

I/O6

NA

I5、6

NA

NA

I/O

I/O

I/O6

NA

NA

脚注 2 NAは、該当なしを意味します。

脚注 3

I/O = 他に指定されている場合を除き、変換は入力および出力に対して有効です。

LOBデータ型のデータ変換

表5-6 LOBのデータ変換

外部データ型 内部データ型
CLOB BLOB

VARCHAR

I/O脚注4

NA脚注5

CHAR

I/O

NA

LONG

I/O

NA

LONG VARCHAR

I/O

NA

STL String

I/O

NA

RAW

NA

I/O

VARRAW

NA

I/O

LONG RAW

NA

I/O

LONG VARRAW

NA

I/O

OCCI Bytes

NA

I/O

脚注 4

I/O = 変換は入力および出力に対して有効です。

脚注 5

NAは、該当なしを意味します。

関連項目:

LOBデータ型の概要については、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください。

日付、タイムスタンプおよび間隔データ型のデータ変換

文字データ型を、日時列または間隔列のフェッチ操作または挿入操作で使用するホスト変数に対して使用することもできます。Oracleでは、文字データ型と日時/間隔データ型との間の変換が行われます。

表5-7 日付、タイムスタンプおよび間隔データ型のデータ変換

外部型 内部型
NA(6) VARCHAR、CHAR DATE TS TSTZ TSLTZ INTERVAL YEAR TO MONTH INTERVAL DAY TO SECOND

VARCHAR2、CHAR

I/O脚注7

I/O

I/O

I/O

I/O

I/O

I/O

STL String

I/O

I/O

I/O

I/O

I/O

I/O

I/O

DATE

I/O

I/O

I/O

I/O

I/O

NA

NA

OCCI Date

I/O

I/O

I/O

I/O

I/O

NA

NA

ANSI DATE

I/O

I/O

I/O

I/O

I/O

NA

NA

TIMESTAMP (TS)

I/O

I/O

I/O

I/O

I/O

NA

NA

OCCI Timestamp

I/O

I/O

I/O

I/O

I/O

NA

NA

TIMESTAMP WITH TIME ZONE(TSTZ)

I/O

I/O

I/O

I/O

I/O

NA

NA

TIMESTAMP WITH LOCAL TIME ZONE(TSLTZ)

I/O

I/O

I/O

I/O

I/O

NA

NA

INTERVALYEARTOMONTH

I/O

NA

NA

NA

NA

I/O

NA

OCCI IntervalYM

I/O

NA

NA

NA

NA

I/O

NA

INTERVALDAYTOSECOND

I/O

NA

NA

NA

NA

NA

I/O

OCCI IntervalDS

I/O

NA

NA

NA

NA

NA

I/O

脚注 6 NAは、該当なしを意味します。

脚注 7

I/O = 変換は入力および出力に対して有効です。

これらの変換は、日付、タイムスタンプおよび間隔データ型のデータ変換の場合に適用されます。

  • タイム・ゾーンがあるソースをタイム・ゾーンのないターゲットに割り当てると、ソースのタイム・ゾーン部分は無視されます。タイム・ゾーンのないソースをタイム・ゾーンがあるターゲットに割り当てると、ターゲットのタイム・ゾーンには、セッションのデフォルト・タイム・ゾーンが設定されます。

  • Oracle DATETIMESTAMPに割り当てると、DATETIME部分がTIMESTAMPにコピーされます。TIMESTAMPをOracle DATEに割り当てると、割当て後のDATETIME部分には0 (ゼロ)が設定されます。この0 (ゼロ)設定は、Oracle DATEからANSI準拠のDATETIMEデータ型への移行を容易にするために行われます。

  • (ANSI DATEをOracle DATEまたはTIMESTAMPに割り当てると、Oracle DATETIME部分とTIMESTAMPには0(ゼロ)が設定されます。Oracle DATEまたはTIMESTAMPをANSI DATEに割り当てると、TIME部分は無視されます。

  • DATETIMEを文字列に割り当てると、DATETIMEは、セッションのデフォルトのDATETIME形式によって変換されます。文字列をDATETIMEに割り当てる場合は、その文字列にセッションのデフォルトのDATETIME形式に基づく有効なDATETIME値が含まれていることが必要です。

  • 文字列をINTERVALに割り当てる場合、その文字列が有効なINTERVAL文字形式であることが必要です。

  • TSLTZからCHARDATETIMESTAMPおよびTSTZへの変換時には、セッションのタイム・ゾーンに値が調整されます。

  • CHARDATEおよびTIMESTAMPからTSLTZへの変換時には、そのセッションのタイム・ゾーンがメモリーに格納されます。

  • TSLTZANSI DATEに割り当てると、時間部分が0 (ゼロ)になります。

  • TSTZからの変換時には、タイム・スタンプが存在しているタイム・ゾーンがメモリーに格納されます。

  • 文字列を間隔に割り当てる場合、その文字列は有効な間隔の文字フォーマットである必要があります。