ヘッダーをスキップ
Oracle Call Interfaceプログラマーズ・ガイド
11g リリース1(11.1)
E05677-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

3 データ型

この章は、OCIアプリケーションで使用するOracle外部データ型についてのリファレンスです。この章では、Oracleデータ型、および独自に作成したプログラムとOracleの間でデータを転送する場合に行われる、データの内部表現と外部表現の変換についても説明します。

この章は、次の項目で構成されています。

Oracleデータ型

OCIプログラムの重要な機能の1つは、Oracleサーバーを介してデータベースと通信を行うことです。OCIアプリケーションでは、SQL SELECTを使用した問合せによってデータベースの表からデータを取り出すか、INSERTUPDATEまたはDELETE文を使用して表内の既存データを変更します。

データベース内では、値は表の列に格納されています。内部的には、Oracleは内部データ型という特別な形式でデータを表現します。内部データ型の例として、NUMBERCHARDATEなどがあります。

一般的に、OCIアプリケーションではデータの内部データ型表現を処理しませんが、そのアプリケーションが作成された言語によって事前定義されたホスト言語のデータ型が処理されます。OCIクライアント・アプリケーションとデータベースの表の間でデータが転送されるとき、OCIライブラリによって、内部データ型と外部データ型の間でデータ変換が行われます。

外部データ型は、OCIヘッダー・ファイル内に定義されているホスト言語型です。OCIアプリケーションで入力変数をバインドするとき、バインド・パラメータの1つで変数の外部データ型コード(またはSQLTコード)を指示します。同様に、定義コールで出力変数を指定するとき、取り出されるデータの外部表現を指定する必要があります。

外部データ型が内部データ型と同じ場合もあります。外部型を使用すると、専用データ形式ではなくホスト言語の型を操作できるので、プログラマにとって便利です。


注意:


一部の外部データ型は内部データ型に類似していますが、OCIアプリケーションが内部データ型にバインドされることはありません。ここでは、内部データ型がどのように外部データ型にマップされるかを理解するために説明します。

OCIでは、OracleとOCIアプリケーション間でデータを転送する際、広範囲のデータ型変換を行うことができます。Oracle内部データ型よりOCI外部データ型のほうが多くあります。単一の外部型を1つの内部型にマップする場合もあり、複数の外部型を単一の内部型にマップする場合もあります。

あるデータ型が多対1の関係でマッピングされることによって、OCIプログラムに柔軟性が提供されます。たとえば、次のSQL文を処理しているとします。

SELECT sal FROM emp WHERE empno = :employee_number

このとき、sal(給与)を2進数浮動小数点形式ではなく文字データ型として戻すには、sal列に対するOCIDefineByPos()コールのdtyパラメータに、VARCHAR2(コード= 1)やCHAR(コード= 96)などのOracle外部文字列データ型を指定します。また、プログラムで文字列変数を宣言し、そのアドレスをvaluepパラメータで指定する必要があります。

ただし、給与情報を2進数浮動小数点値として戻す場合は、FLOAT(コード= 4)外部データ型を指定します。また、valuepパラメータに適切な型の変数を定義する必要があります。

ほとんどのデータ変換が透過的に実行されます。また、ほとんどすべての外部データ型を指定できるため、特殊なタスクを実行できます。たとえば、DATE外部データ型を使用すると、文字変換を行わずに純粋なバイナリ形式でDATE値を入出力できます。詳細は、「DATE」の外部データ型の説明を参照してください。

データ変換を制御するには、適切な外部データ型コードをバインド・ルーチンおよび定義ルーチンで使用する必要があります。OCIプログラム内の入力変数または出力変数の位置、および変数のデータ型と長さをOracleに対して指定する必要があります。

また、OCIでは、オブジェクト型属性のデータ型を表すためにOracleの型管理システムで使用する一連のOCI型コードも用意されています。これらの型コードを表すために使用する一連の事前定義済の定数があります。各定数には接頭辞OCI_TYPECODEが含まれます。

要約すると、OCIプログラマは、次の各種のデータ型またはデータ表現について認識する必要があります。










列の内部データ型についての情報は、内部データ型コードの形式でアプリケーションに送られます。アプリケーション側では、どの型のデータが戻されるのかがわかると、出力データの変換方法と書式設定の方法について適切な判断ができます。Oracle内部データ型コードのリストは、「内部データ型」を参照してください。


関連項目:

  • Oracle内部データ型の詳細は、『Oracle Database SQLリファレンス』を参照してください。

  • 問合せでの選択リスト項目記述の詳細は、「選択リスト項目の記述」を参照してください。


外部データ型コードの使用

外部データ型コードによって、プログラムでのホスト変数のデータ表現方法が指定されます。これによって、プログラムの出力変数にデータが戻されるときの変換方法、または入力(バインド)変数からOracleの列値へのデータ変換方法が決まります。たとえば、Oracle列のNUMBERを可変長文字配列に変換する場合は、出力変数を定義するOCIDefineByPos()コールでVARCHAR2外部データ型コードを指定します。

バインド変数をOracle列の値に変換するには、バインド変数の型に対応する外部データ型コードを指定します。たとえば、02-FEB-65などの文字列をDATE列に入力する場合は、データ型を文字列として指定し、文字列長パラメータを9に設定します。

使用する値を変換可能にするのは、常にプログラマの責任です。文字列"MY BIRTHDAY"DATE列に挿入する文を実行すると、エラーが発生します。


関連項目:


外部データ型およびデータ型コードの完全なリストは、表3-2「外部データ型とそのコード」を参照してください。

内部データ型

表3-1は、Oracle内部(組込み)データ型を各型の最大内部長およびデータ型コードとともに示しています。

表3-1 Oracle内部データ型

Oracle内部データ型 最大内部長 データ型コード

VARCHAR2、NVARCHAR2

4000バイト

1

NUMBER

21バイト

2

LONG

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

8

DATE

7バイト

12

RAW

2000バイト

23

LONG RAW

2^31-1バイト

24

ROWID

10バイト

69

CHAR、NCHAR

2000バイト

96

BINARY_FLOAT

4バイト

100

BINARY_DOUBLE

8バイト

101

ユーザー定義型(オブジェクト型、VARRAYNested Table

該当なし

108

REF

該当なし

111

CLOB、NCLOB

128TB

112

BLOB

128TB

113

BFILE

オペレーティング・システムの最大ファイル・サイズまたはUB8MAXVAL

114

TIMESTAMP

11バイト

180

TIMESTAMP WITH TIME ZONE

13バイト

181

INTERVAL YEAR TO MONTH

5バイト

182

INTERVAL DAY TO SECOND

11バイト

183

UROWID

3950バイト

208

TIMESTAMP WITH LOCAL TIME ZONE

11バイト

231



関連項目:


これらの組込みデータ型の詳細は、『Oracle Database SQLリファレンス』を参照してください。

LONG、RAW、LONG RAW、VARCHAR2

OCIBindByName()OCIBindByPos()OCIDefineByPos()OCIStmtGetPieceInfo()およびOCIStmtSetPieceInfo()によって提供されるピース単位機能を使用すると、これらの型の列データの挿入、更新またはフェッチを実行できます。

文字列およびバイト配列

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


注意:


LOBには文字を、BFILEにはバイナリ・データを含めることができます。これらは、他の型とは異なる処理がされるので、ここでは説明しません。これらのデータ型の詳細は、第7章「LOBおよびBFILEの操作」を参照してください。

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

表の列ごとに適切なOracle内部データ型を選択するのは、データベースの設計者の責任です。OCIプログラマは、文字データおよびバイト配列データの表現方法、およびOCIプログラムの変数とOracle表の間でのデータの変換方法を多数知っておく必要があります。

配列に文字が入っている場合、OCIコール内の配列の長さを示すパラメータは、常に文字単位ではなくバイト単位で渡され、バイト単位で戻されます。

UROWID

ユニバーサルROWIDUROWID)は、Oracle表の論理ROWIDおよび物理ROWIDを格納するデータ型です。論理ROWIDは、索引構成表(IOT)の行に対する主キー・ベースの論理識別子です。

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

次のホスト変数を、ユニバーサルROWIDにバインドできます。

  • SQLT_CHRVARCHAR2

  • SQLT_VCSVARCHAR

  • SQLT_STRNULL文字で終了する文字列)

  • SQLT_LVCLONG VARCHAR

  • SLQT_AFCCHAR

  • SQLT_AVCCHARZ

  • SQLT_VST(OCI文字列)

  • SQLT_RDDROWID記述子)

BINARY_FLOATおよびBINARY_DOUBLE

BINARY_FLOATデータ型およびBINARY_DOUBLEデータ型は、単精度浮動小数点値および倍精度浮動小数点値を表現し、主に、浮動小数点演算のIEEE754標準に準拠しています。

これらのデータ型が追加される前は、Oracleデータベース内の数値はすべて、Oracle NUMBER書式で格納されていました。この新しいバイナリ浮動小数点型は、Oracle NUMBERを置換するのではなく、Oracle NUMBERの代替として機能するため、ディスク領域の使用量が少なくて済むという利点があります。

この内部型は、次のコードで表現されます。

  • BINARY_FLOATSQLT_IBFLOAT

  • BINARY_DOUBLE SQLT_IBDOUBLE

次のホスト変数はすべて、BINARY_FLOATデータ型およびBINARY_DOUBLEデータ型にバインドできます。

  • SQLT_BFLOAT(システム固有のfloat)

  • SQLT_BDOUBLE(システム固有のdouble)

  • SQLT_INT(integer)

  • SQLT_FLT(float)

  • SQLT_NUM(Oracle NUMBER

  • SQLT_UIN(unsigned)

  • SQLT_VNUVARNUM

  • SQLT_CHRVARCHAR2

  • SQLT_VCSVARCHAR

  • SQLT_STRNULL文字で終了する文字列)

  • SQLT_LVCLONG VARCHAR

  • SQLT_AFCCHAR

  • SQLT_AVCCHARZ

  • SQLT_VST(OCI文字列)

最適なパフォーマンスを得るために、BINARY_FLOATデータ型およびBINARY_DOUBLEデータ型とともに、外部型SQLT_BFLOATSQLT_BDOUBLEを使用することをお薦めします。

外部データ型

表3-2は、外部データ型のデータ型コードを示しています。この表ではデータ型ごとに、Oracle内部データの変換元または変換先となる、Cのプログラム変数の型を示しています。

表3-2 外部データ型とそのコード

外部データ型 CODE プログラム変数 OCI定義の定数

VARCHAR2

1

char[n]

SQLT_CHR

NUMBER

2

unsigned char[21]

SQLT_NUM

8ビット符号付きINTEGER

3

signed char

SQLT_INT

16ビット符号付きINTEGER

3

signed short、signed int

SQLT_INT

32ビット符号付きINTEGER

3

signed int、signed long

SQLT_INT

FLOAT

4

float、double

SQLT_FLT

ヌル文字で終了するSTRING

5

char[n+1]

SQLT_STR

VARNUM

6

char[22]

SQLT_VNU

LONG

8

char[n]

SQLT_LNG

VARCHAR

9

char[n+sizeof(short integer)]

SQLT_VCS

DATE

12

char[7]

SQLT_DAT

VARRAW

15

unsigned char[n+sizeof(short integer)]

SQLT_VBI

システム固有のfloat

21

float

SQLT_BFLOAT

システム固有のdouble

22

double

SQLT_BDOUBLE

RAW

23

unsigned char[n]

SQLT_BIN

LONG RAW

24

unsigned char[n]

SQLT_LBI

UNSIGNED INT

68

unsigned

SQLT_UIN

LONG VARCHAR

94

char[n+sizeof(integer)]

SQLT_LVC

LONG VARRAW

95

unsigned char[n+sizeof(integer)]

SQLT_LVB

CHAR

96

char[n]

SQLT_AFC

CHARZ

97

char[n+1]

SQLT_AVC

ROWID記述子

104

OCIRowid *

SQLT_RDD

名前付きデータ型

108

struct

SQLT_NTY

REF

110

OCIRef

SQLT_REF

キャラクタLOB記述子

112

OCILobLocator(注意2を参照)

SQLT_CLOB

バイナリLOB記述子

113

OCILobLocator(注意2を参照)

SQLT_BLOB

バイナリFILE記述子

114

OCILobLocator

SQLT_FILE

OCI STRING

155

OCIString

SQLT_VST(注意1を参照)

OCI DATE

156

OCIDate*

SQLT_ODT(注意1を参照)

ANSI DATE記述子

184

OCIDateTime *

SQLT_DATE

TIMESTAMP記述子

187

OCIDateTime *

SQLT_TIMESTAMP

TIMESTAMP WITH TIME ZONE記述子

188

OCIDateTime *

SQLT_TIMESTAMP_TZ

INTERVAL YEAR TO MONTH記述子

189

OCIInterval *

SQLT_INTERVAL_YM

INTERVAL DAY TO SECOND記述子

190

OCIInterval *

SQLT_INTERVAL_DS

TIMESTAMP WITH LOCAL TIME ZONE記述子

232

OCIDateTime *

SQLT_TIMESTAMP_LTZ



注意:


データ長がnとなっている場合、nは可変でプログラム(ROWIDの場合はオペレーティング・システム)の要件に依存します。

次の3つの型はPL/SQLに対する内部型で、OCIでは値として戻すことができません。

VARCHAR2

VARCHAR2データ型は、最大長4000バイトの可変長文字列です。


注意:


Oracleオブジェクトを使用する場合は、一連の事前定義済OCI関数を使用することにより、特殊なOCIString外部データ型を扱うことができます。このデータ型の詳細は、第12章「OCIのオブジェクト・リレーショナル・データ型」を参照してください。

入力

OCIBindByName()またはOCIBindByPos()コールでは、value_szパラメータによって長さが決定されます。

value_szパラメータが0(ゼロ)より大きい場合は、指定のバイト数のみがプログラムのバッファ・アドレスの先頭から読み取られて、バインド変数値が取得されます。後続の空白は削除され、結果の値はSQL文またはPL/SQLブロックで使用されます。INSERT文の場合、結果の値がデータベース列で定義された長さより長いと、INSERTは失敗しエラーが戻されます。


注意:


後続のNULLは除去されません。変数はヌル文字で終了させずに、空白埋めをする必要があります。

value_szパラメータが0(ゼロ)の場合、バインド変数は、実際の内容とは無関係にNULLとして処理されます。NULLは、SQL文のバインド変数値として使用できます。NOT NULL整合性制約付きの列にNULLを挿入しようとすると、エラーとなり、行は挿入されません。

Oracle内部(列)データ型がNUMBERの場合、数値の文字表現が含まれている文字列からの入力は有効です。入力文字列は内部数値形式に変換されます。VARCHAR2文字列に無効な変換文字が含まれている場合、エラーが戻され、値はデータベースに挿入されません。

出力

OCIDefineByPos()コールのvalue_szパラメータで、または、PL/SQLブロックの場合はOCIBindByName()OCIBindByPos()value_sz パラメータで、戻り値の希望の長さを指定します。長さとしてゼロを指定した場合、データは戻されません。

OCIDefineByPos()rlenpパラメータを省略すると、戻される値はバッファ長に達するまで空白が埋め込まれ、空白文字の文字列としてNULLが戻されます。rlenpを指定した場合、戻り値は空白埋めされません。かわりに、実際の長さがrlenpパラメータに戻されます。

NULLが戻されたかどうか、または文字の切捨てが発生したかどうかをチェックするには、OCIDefineByPos()コールにインジケータ・パラメータを指定します。NULLがフェッチされた場合に、インジケータ・パラメータが-1に設定され、戻り値が切り捨てられている場合は、インジケータ・パラメータが元の列長に設定されます。それ以外の場合は、0(ゼロ)が設定されます。インジケータ・パラメータを指定していない場合、NULLが選択されると、フェッチ・コールでエラー・コードOCI_SUCCESS_WITH_INFOが戻されます。エラーについての診断情報の取出しでは、ORA-01405が戻されます。


関連項目:


「標識変数」

NUMBER

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


注意:


Oracleデータベース・サーバー内でオブジェクトを使用する場合は、一連の事前定義済OCI関数を使用して、特殊なOCINumberデータ型を扱うことができます。このデータ型の詳細は、第12章「OCIのオブジェクト・リレーショナル・データ型」を参照してください。

NUMBERデータ型の値を可変長形式で格納します。最初のバイトは指数であり、その後に1〜20個の仮数バイトが続きます。指数バイトの上位ビットは符号ビットです。正数の場合はそのビットが設定され、負数の場合は消去されます。下位の7ビットは指数を表します。この指数はオフセット65で基本100の数字です。

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に対する仮数は96(101-5)となります。負数には、102が含まれているバイトがデータ・バイトの後に追加されます。ただし、20個の仮数バイトを持つ負数には、102のバイトは後続しません。仮数バイトは基本100であるため、各バイトは2桁の10進数値を表すことができます。仮数は正規化され、先行する0(ゼロ)は格納されません。

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

OCIDefineByPos()コールのdtyパラメータにデータ型コード2を指定すると、プログラムではこのOracle内部形式で数値データを受け取ります。出力変数は、可能な最大の数値を格納できる21バイトの配列である必要があります。数値を表すバイトのみが戻されることに注意してください。空白埋めまたはヌル文字終了はありません。戻されたバイト数を調べる場合は、NUMBERではなくVARNUM外部型を使用します。


関連項目:


INTEGER

INTEGERデータ型では数値を変換します。外部INTEGERは符号付きの2進数です。バイト単位のサイズはシステムによって異なります。変数内のバイトの順序は、ホスト・システム・アーキテクチャによって決まります。長さ指定は、入力でも出力でも必須です。Oracleから戻される数値が整数でない場合、小数部分は廃棄され、エラーやその他の情報は戻されません。戻される数値がシステムの符号付きINTEGERで表現できない場合は、「変換時にオーバーフローが発生しました(overflow on conversion)」エラーが戻されます。

FLOAT

FLOATデータ型は、小数部分のある数値、またはINTEGERでは表現できない数値を処理します。数値はホスト・システムの浮動小数点書式で表されます。通常、長さは4バイトか8バイトのいずれかです。長さ指定は、入力および出力の両方について必要です。

Oracleの数値の内部形式は10進数で、大部分の浮動小数点は2進数です。したがって、数値を浮動小数点で表現するよりもより高い精度で表現できます。


注意:


FLOATおよびNUMBER間の変換時には丸め処理のエラーが発生する場合もあります。問合せでバインド変数としてFLOATを使用すると、ORA-01403エラーが戻されることがあります。この状況を回避するには、FLOATSTRINGに変換し、VARCHAR2またはNULL終了文字列を設定します。

STRING

ヌル文字で終了するSTRING形式は、文字列にヌル終端文字が必要であることを除けば、VARCHAR2形式と同じように動作します。このデータ型は、特にC言語のプログラムで有用です。

入力

OCIBindByName()またはOCIBindByPos()コールで供給される文字列の長さによって、ヌル終端文字があるかどうかのスキャンの範囲が制限されます。ヌル終端文字が指定された中で見つからなかった場合は、エラーとなります。

ORA-01480: STRバインド値に終了のNULLがありません。

バインド・コールで長さが指定されていない場合、OCIは、文字列の暗黙の最大長の4000を使用します。

文字列の最小の長さは2バイトです。最初の文字がヌル終端文字であり、長さが2と指定されている場合、許可されていればNULLが列に挿入されます。VARCHAR2型およびCHAR型とは異なり、空白のみを含む文字列は入力時にNULLとして扱われるのではなく、そのまま挿入されます。


注意:


OCIのこれまでのバージョンとは異なり、リリース8.0以上のOCIでは、ヌル文字で終了する文字列の文字列長パラメータに-1を渡せません。

出力

ヌル終端文字は、最後の文字が戻された後に配置されます。文字列が指定のフィールド長より長い場合、文字列は切り捨てられ、出力変数の最後の文字の位置にヌル終端文字が入ります。

NULL選択リスト項目は、最初の文字の位置にヌル終端文字を戻します。ORA-01405エラーが戻される可能性があります。

VARNUM

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

表3-3に、表の数値に戻されるVARNUM値の例をいくつか示します。

表3-3 VARNUMの例

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

0

1

128

該当なし

該当なし

5

2

193

6

該当なし

-5

3

62

96

102

2767

3

194

28, 68

該当なし

-2767

4

61

74, 34

102

100000

2

195

11

該当なし

1234567

5

196

2, 24, 46, 68

該当なし


LONG

LONGデータ型では、4001バイト以上の文字列を格納します。LONG列には、最大2GB(2^31-1バイト)を格納できます。この列の型は、長い文字列の格納およびフェッチにのみ使用します。関数、式またはWHERE句では使用できません。一般的に、LONG列値の変換は、文字列との間で行われます。

表の作成には、LONG列ではなく、LOB列(CLOBNCLOBまたはBLOB)を使用してください。LONG列は、下位互換性を保つためにのみサポートされています。

既存のLONG列をLOB列に変換することもお薦めします。LOB列の制限の数は、LONG列の制限の数よりも、かなり少なくなっています。さらに、LOB機能はすべてのリリースで拡張されていますが、LONG機能は複数のリリースで変更されていません。

VARCHAR

VARCHARデータ型では、可変長の文字列が格納されます。先頭の2バイトには文字列の長さが記述され、残りのバイトには文字列が含まれます。バインド・コールまたは定義コールで指定する文字列の長さには、この2バイトを含める必要があるため、送受信可能なVARCHAR文字列の最大長は、65535バイトではなく、65533バイトになります。

DATE

DATEデータ型では、Oracle内部日付バイナリ形式を使用して、日付の値の更新、挿入または検索を行うことができます。バイナリ形式の日付は、表3-4に示すとおり7バイトです。

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

バイト 1 2 3 4 5 6 7

意味

世紀

例(1992年11月30日午後3時17分)

119

192

11

30

16

18

1


世紀および年を表すバイト(バイト1および2)の値は、100を加算した表記です。最初のバイトには世紀が格納されます。この例の1992年の表記は、1992を100で除算し、100を加算した整数の119になります。2番目のバイトには、100を加算した年が格納され、この例では192になります。西暦紀元前(BCE)は100未満です。西暦紀元はBCE 4712年1月1日、つまりユリウス日の第1日です。この日付の場合、世紀バイトは53、年バイトは88です。時間バイト、分バイトおよび秒バイトは1を加算する表記法で表されます。時間バイトの範囲は1〜24、分および秒バイトは1〜60です。データ作成時に時刻を指定しないと、時刻はデフォルトで深夜(1, 1, 1)となります。

DATE外部データ型を使用してバイナリ形式で日付を入力する場合、データベースでは一貫性または範囲のチェックは行いません。この形式になっているすべてのデータは、入力前に注意して検証する必要があります。


注意:


日常のデータベース操作で、Oracle外部DATEデータ型が必要になることはほとんどありません。一般にプログラムではDD-MON-YYなどのように文字形式でデータを扱うため、DATEは文字形式に変換した方がはるかに便利です。

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


関連項目:


Oracleデータベースでオブジェクトを使用する場合は、一連の事前定義済OCI関数を使用して、特殊なOCIDateデータ型を扱うことができます。

RAW

RAWデータ型は、たとえば図形文字列の格納など、Oracleで解釈されないバイナリ・データまたはバイト列で使用されます。RAW列の最大長は2000バイトです。


関連項目:


『Oracle Database SQLリファレンス』

Oracle表内のRAWデータ(ロー・データ)がプログラムで文字列に変換される場合、データは16進文字コードで表されます。RAWデータの各バイトは、それぞれの値を示す'00'〜'FF'の2文字で戻されます。プログラムの文字列をOracle表内のRAW列に入力する場合は、この16進コードを使用して文字列のデータをコード化する必要があります。

OCIDefineByPos()OCIBindByName()OCIBindByPos()OCIStmtGetPieceInfo()およびOCIStmtSetPieceInfo()によって提供されるピース単位機能を使用すると、RAW列(またはLONG RAW列)を扱う挿入、更新またはフェッチを実行できます。


関連項目:


Oracleデータベースでオブジェクトを使用する場合は、一連の事前定義済OCI関数を使用して、特殊なOCIRawデータ型を扱うことができます。このデータ型の詳細は、第12章「OCIのオブジェクト・リレーショナル・データ型」を参照してください。

VARRAW

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

LONG RAW

LONG RAWデータ型は、最大2GB(2^31-1バイト)のRAWデータを格納できるということを除けば、RAWデータ型と同じです。

UNSIGNED

UNSIGNEDデータ型は、符号なし2進整数に対して使用されます。バイト単位のサイズは、システムによって異なります。ワード内のバイトの順序は、ホスト・システムのアーキテクチャによって決まります。長さ指定は、入力でも出力でも必須です。Oracleから出力される数値が整数でない場合は、小数部分が廃棄され、エラーやその他の情報は戻されません。戻される数値がシステムの符号なし整数より大きくて表現できない場合、「変換時にオーバーフローが発生しました(overflow on conversion)」というエラーが戻されます。

LONG VARCHAR

LONG VARCHARデータ型は、OracleのLONG列からデータを格納する場合、またはこの列にデータを格納する場合に使用します。LONG VARCHARの先頭の4バイトには項目の長さが記述されます。したがって、格納される項目の最大長は、2^31-5バイトです。

LONG VARRAW

LONG VARRAWデータ型は、Oracle LONG RAW列からデータを格納する場合、またはこの列にデータを格納する場合に使用します。長さは、先頭の4バイトに記述されます。最大長は、2^31-5バイトです。

CHAR

CHARデータ型は最長2000の文字列です。CHAR文字列は空白埋め比較セマンティクスで比較されます。


関連項目:


『Oracle Database SQLリファレンス』

入力

長さは、OCIBindByName()またはOCIBindByPos()コールのvalue_szパラメータによって決まります。


注意:


バッファの全内容(value_szの文字数)は、後続の空白またはNULLもすべて含めてデータベースに渡されます。

value_szパラメータが0(ゼロ)の場合、バインド変数は、実際の内容とは無関係にNULLとして処理されます。NULLは、SQL文のバインド変数値として使用できます。NOT NULL整合性制約付きの列にNULLを挿入しようとすると、エラーとなり、行は挿入されません。

CHARの場合、value_szパラメータには負の値を使用できません。

Oracle内部(列)データ型がNUMBERの場合、数値の文字表現が含まれている文字列からの入力は有効です。入力文字列は内部数値形式に変換されます。CHAR文字列に無効な変換文字が含まれている場合、エラーが戻され、値は挿入されません。数値変換は、使用しているシステムのグローバリゼーション・サポートの設定値によって規定される規則に従って行われます。たとえば、システムが、ピリオドではなくカンマを小数点として認識するように構成されている場合もあります。

出力

OCIDefineByPos()コールのvalue_szパラメータで、戻り値の希望の長さを指定します。長さとしてゼロを指定した場合、データは戻されません。

OCIDefineByPos()rlenpパラメータを省略すると、戻される値はバッファ長に達するまで空白が埋め込まれ、空白文字の文字列としてNULLが戻されます。rlenpを指定した場合、戻り値は空白埋めされません。かわりに、実際の長さがrlenpパラメータに戻されます。

NULLが戻されたかどうか、または文字の切捨てが発生したかどうかをチェックするには、OCIDefineByPos()コールにインジケータ・パラメータまたはインジケータ・パラメータの配列を指定します。インジケータ・パラメータには、NULLがフェッチされた場合は-1が設定され、値が切り捨てられて戻された場合は元の列の長さが設定されます。それ以外の場合は、0(ゼロ)が設定されます。インジケータ・パラメータを指定していない場合、NULLが選択されると、フェッチ・コールでORA-01405エラーが戻されます。


関連項目:


「標識変数」

内部NUMBERデータ型から文字列への出力を要求することもできます。数値変換は、使用しているシステムのグローバリゼーション・サポートの設定値によって規定される規則に従って行われます。たとえば、システムが、ピリオド(.)ではなくカンマ(,)を小数点として認識するように構成されている場合もあります。

CHARZ

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

入力時に、長さのパラメータは、ヌル終端文字も含めた正確な長さを示す必要があります。たとえば、Cの配列が次のように宣言されたとします。

char my_num[] = "123.45";

この場合、my_numのバインド時の長さのパラメータは7になっている必要があります。この例で他の値を指定すると、エラーが戻されます。

次の新しい外部データ型は、リリース8.0から導入されました。これらのデータ型は、Oracle7 Serverへ接続した場合にはサポートされません。


注意:


内部データ型および外部データ型は、いずれもそれぞれのデータ型コードに対応するOracle定義の定数値(SQLT_NTYSQLT_REFなど)を含んでいます。この章に出てくるすべての型についての定数はリストしていませんが、この項では新しいOracleデータ型を説明する際に、それらの定数を使用します。また、データ型定数は、これらの新しい型を参照するときに、このマニュアルの他の章でも使用されます。

名前付きデータ型: オブジェクト、VARRAY、NESTED TABLE

名前付きデータ型は、SQLのCREATE TYPEコマンドで指定するユーザー定義の型です。例として、オブジェクト型、VARRAY、NESTED TABLEなどがあります。OCIでは、名前付きデータ型は型のホスト言語による表現を意味します。SQLT_NTYデータ型コードは、名前付きデータ型をバインドまたは定義する際に使用します。

Cアプリケーションでは、名前付きデータ型はC構造体として表されます。このような構造体は、データベース内に格納された型からObject Type Translator(OTT)を使用して生成されます。これらの型は、OCI_TYPECODE_OBJECTに対応します。


関連項目:


REF

これは名前付きデータ型への参照です。REFのC言語表現は、OCIRef *型として宣言された変数です。SQLT_REFデータ型コードは、REFをバインドまたは定義する際に使用します。

REFにアクセスできるのは、OCIアプリケーションをオブジェクト・モードで初期化した場合のみです。サーバーからREFが取り出されると、REFはクライアント側のオブジェクト・キャッシュに格納されます。

アプリケーションで使用するREFを割り当てるには、変数をREFへのポインタとして宣言し、OCI_TYPECODE_REFtypecodeパラメータとして渡すOCIObjectNew()をコールします。


関連項目:


OCIでREFを使用する場合の詳細は、第14章「OCIのオブジェクトに関する高度なトピック」を参照してください。

ROWID記述子

ROWIDデータ型は、データベースの表の特定の行を識別するために使用されます。ROWIDは、次のように、問合せの選択リスト項目になっている場合があります。

SELECT ROWID, ename, empno FROM emp

このケースでは、戻されたROWIDを後続のDELETE文で使用できます。

SELECT FOR UPDATEを実行する場合、ROWIDは暗黙的に戻されます。文ハンドルでOCIAttrGet()を使用して、このROWIDをユーザーが割り当てたROWID記述子に読み取り、後続のUPDATE文で使用できます。プリフェッチ操作ではSELECT FOR UPDATEのすべてのROWIDがフェッチされるため、プリフェッチを使用してから単一行フェッチを行います。

ROWIDへのアクセスはROWID記述子を使用して行います。この記述子はバインド変数または定義変数として使用できます。


関連項目:


ROWID記述子の使用方法の詳細は、「OCI記述子」および「位置指定の更新および削除」を参照してください。

LOB記述子

LOB(ラージ・オブジェクト)には、長さが最大128TBのバイナリ・データまたは文字データを格納できます。バイナリ・データはBLOB(バイナリLOB)に格納され、文字データは、CLOB(キャラクタLOB)またはNCLOB(各国語キャラクタLOB)に格納されます。

LOB値は、データベースの行データとともに、インラインに格納される場合とされない場合があります。いずれの場合も、LOBは、データベース・サーバーのトランザクションを完全にサポートしています。データベースの表には、別の記憶領域にあるLOB値を指すLOBロケータが格納されます。

OCIアプリケーションで選択リストにLOB列または属性を含むSQL問合せを発行した場合、問合せ結果のフェッチでは、実際のLOB値ではなくロケータが戻されます。OCIでは、LOBロケータはOCILobLocator型の変数にマッピングされます。


注意:


アプリケーションによって、LOBロケータを使用する場合と使用しない場合があります。LOBのデータ・インタフェースを使用できますが、このインタフェースはLOBロケータを必要としません。このインタフェースでは、CLOB列の文字データ、またはBLOB列のRAWデータをバインドまたは定義できます。


関連項目:


LOBに対するOCI関数は、LOBロケータを引数の1つとして受け取ります。LOBにデータが含まれているかどうかに関係なく、OCI関数はそのLOBを指すロケータがすでに作成済であるとみなします。

バインド操作および定義操作は、OCIDescriptorAlloc()関数で割り当てられるLOBロケータ上で実行されます。

SQLまたはOCIObjectPin()を使用して、常に最初にロケータをフェッチしてから、ロケータを使用して操作を実行します。OCI関数が実際のLOB値をパラメータとして受け取ることはありません。


関連項目:


OCI LOB関数の詳細は、第7章「LOBおよびBFILEの操作」を参照してください。

LOBをバインドまたは定義するために使用できるデータ型コードは、次のとおりです。

  • SQLT_BLOB: バイナリLOBデータ型

  • SQLT_CLOB: キャラクタLOBデータ型

NCLOBは、次の要件を伴うCLOBの特殊型です。

  • NCLOBに対する書込みおよび読取りを行うには、キャラクタ・セット・フォーム(csfrm)パラメータをSQLCS_NCHARに設定する必要があります。

  • CLOBおよびNCLOBを含むコールのamount(amtp)パラメータは常に、バイトではなく固定幅キャラクタ・セットの文字として解釈されます。

BFILE

Oracleでは、バイナリ・ファイル、つまりBFILEへのアクセスがサポートされます。BFILEデータ型を使用すると、Oracleデータベース以外のファイル・システムに格納されているファイルLOBへのアクセスが可能になります。

BFILEの列または属性には、サーバーのファイル・システムにあるバイナリ・ファイルへのポインタとして機能するファイルLOBロケータが格納されます。このロケータにより、ディレクトリのオブジェクトとファイル名が維持されます。BFILEの最大サイズは、使用しているオペレーティング・システムの最大ファイル・サイズまたはUB8MAXVALのいずれか小さい方になります。

バイナリ・ファイルLOBは、トランザクションでは使用されません。ファイルの完全性および永続性は、ベースとなるオペレーティング・システムにより提供されます。

データベース管理者は、ファイルが存在していること、およびOracleプロセスがそのファイルに対してオペレーティング・システムの読取り権限を持っていることを確認する必要があります。

BFILEデータ型では、大きなバイナリ・ファイルの読取り専用サポートが可能です。Oracleからファイルを変更することはできません。ファイル・データにアクセスするためのAPIを提供しています。

BFILEをバインドまたは定義するために使用できるデータ型コードは、次のとおりです。

  • SQLT_BFILE: バイナリFILE LOBデータ型


    関連項目:


    ディレクトリ別名の詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください。

BLOB

BLOBデータ型には、非構造化バイナリ・ラージ・オブジェクトが格納されます。BLOBは、キャラクタ・セットのセマンティクスを持たないビット・ストリームと考えられます。BLOBには、最大128TBのバイナリ・データを格納できます。

BLOBは完全なトランザクション・サポートを備えています。OCIを通じて行った変更は、完全にトランザクションで使用できます。BLOB値に対して行った操作は、コミットまたはロールバックできます。1つのトランザクション内で変数のBLOBロケータを保存し、次にそれを別のトランザクションまたはセッションで使用することはできません。

CLOB

CLOBデータ型には固定幅または可変幅の文字データが格納されます。CLOBには、最大128TBの文字データを格納できます。

CLOBは完全なトランザクション・サポートを備えています。OCIを通じて行った変更は、完全にトランザクションで使用できます。CLOB値に対して行った操作は、コミットまたはロールバックできます。1つのトランザクション内で変数のCLOBロケータを保存し、次にそれを別のトランザクションまたはセッションで使用することはできません。

NCLOB

NCLOBは、CLOBの各国語キャラクタ・バージョンです。NCLOBは、固定幅、シングルバイト、マルチバイトの各国語キャラクタ・セット(NCHAR)、または可変幅のキャラクタ・セットのデータを格納します。NCLOBには、最大128TBの文字データを格納できます。

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

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

ここでは、日時および時間隔のデータ型記述子について簡単に説明します。


関連項目:


『Oracle Database SQLリファレンス』

ANSI DATE

ANSI DATEデータ型はDATEデータ型が基本になっていますが、時間部分は含まれていません。タイム・ゾーンもありません。ANSI DATEは、DATEデータ型のANSI仕様に従います。ANSI DATEDATEデータ型またはTIMESTAMPデータ型に割り当てると、OracleのDATEやTIMESTAMPの時間部分は0(ゼロ)に設定されます。DATEデータ型またはTIMESTAMPデータ型をANSI DATEに割り当てると、時間部分は無視されます。

かわりに、日付と時間の両方を含むTIMESTAMPデータ型の使用をお薦めします。

TIMESTAMP

TIMESTAMPは、DATEデータ型を拡張したデータ型です。このデータ型には、DATEデータ型の年、月、日に加えて、時間、分および秒の各値が格納されます。タイム・ゾーンはありません。TIMESTAMPデータ型の書式は次のとおりです。

TIMESTAMP(fractional_seconds_precision)

fractional_seconds_precisionでは、SECOND日時フィールドの小数部分の桁数を指定します。桁数は0〜9を指定でき、デフォルト値は6です。

TIMESTAMP WITH TIME ZONE

TIMESTAMP WITH TIME ZONETSTZ)データ型は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オフセットに関係なく同一とみなされます。

TIMESTAMP WITH LOCAL TIME ZONE

TIMESTAMP WITH LOCAL TIME ZONETSLTZ)データ型は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です。

INTERVAL YEAR TO MONTH

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

INTERVAL YEAR(year_precision) TO MONTH

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

INTERVAL DAY TO SECOND

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関数のDBTIMEZONESESSIONTIMEZONEを問い合せて、データベースとセッションのタイム・ゾーンを確認できます。タイム・ゾーンを手動で設定していない場合、デフォルトでオペレーティング・システムのタイム・ゾーンが使用されます。オペレーティング・システムのタイム・ゾーンが有効なOracleタイム・ゾーンでない場合、UTCがデフォルト値として使用されます。

システム固有のfloatおよびdouble

システム固有のfloat(SQLT_BFLOAT)およびシステム固有のdouble(SQLT_BDOUBLE)データ型は、単精度浮動小数点値および倍精度浮動小数点値を表現します。これらのデータ型は、システムに固有の書式、つまりホスト・システムの浮動小数点書式で表されます。

これらの新しい外部型は、BINARY_FLOATおよびBINARY_DOUBLE内部データ型を外部で表現するために追加されました。したがって、新しい内部型は、外部型のシステム固有のfloatおよびdoubleとともにそれぞれ使用したときに、最適なパフォーマンスが得られます。これにより、浮動小数点値の既存の表現(SQLT_FLT)とこれらの新しい型は、明確に区別されます。

Cオブジェクト・リレーショナル・データ型マッピング

OCIでは、ユーザー定義のデータ型をC表現にマッピングするために使用される、Oracle定義のCデータ型がサポートされています(OCINumberOCIArrayなど)。OCIでは、これらのデータ型を操作するための一連のOCIコールが用意されています。これらのデータ型は、OCI外部データ型とともに、バインド操作および定義操作で使用できます。


関連項目:


Oracle定義のCデータ型の使用方法の詳細は、第12章「OCIのオブジェクト・リレーショナル・データ型」を参照してください。

データ変換

表3-5は、リリース7.3で使用可能な全データ型について、内部データ型から外部データ型、および外部データ型から内部列表現へのサポートされている変換を示しています。リリース7.3より後に追加された新しいデータ型のデータ変換の詳細は、次のとおりです。

表の幅が限られているため、LOBについては表3-6にリストされています。


関連項目:


OCIStringOCINumberおよびその他の新しいデータ型の詳細は、第12章「OCIのオブジェクト・リレーショナル・データ型」を参照してください。

表3-5 データ変換

- 内部データ型-> - - - - - - - -
外部データ型 VARCHAR2 NUMBER LONG ROWID UROWID DATE RAW LONG RAW CHAR

VARCHAR2

I/O

I/O

I/O

I/O(1)

I/O(1)

I/O(2)

I/O(3)

I/O(3)

-

NUMBER

I/O(4)

I/O

I

-

-

-

-

-

I/O(4)

INTEGER

I/O(4)

I/O

I

-

-

-

-

-

I/O(4)

FLOAT

I/O(4)

I/O

I

-

-

-

-

-

I/O(4)

STRING

I/O

I/O

I/O

I/O(1)

I/O(1)

I/O(2)

I/O(3)

I/O(3、5)

I/O

VARNUM

I/O(4)

I/O

I

-

-

-

-

-

I/O(4)

DECIMAL

I/O(4)

I/O

I

-

-

-

-

-

I/O(4)

LONG

I/O

I/O

I/O

I/O(1)

I/O(1)

I/O(2)

I/O(3)

I/O(3、5)

I/O

VARCHAR

I/O

I/O

I/O

I/O(1)

I/O(1)

I/O(2)

I/O(3)

I/O(3、5)

I/O

DATE

I/O

-

I

-

-

I/O

-

-

I/O

VARRAW

I/O(6)

-

I(5、6)

-

-

-

I/O

I/O

I/O(6)

RAW

I/O(6)

-

I(5、6)

-

-

-

I/O

I/O

I/O(6)

LONG RAW

O(6)

-

I(5、6)

-

-

-

I/O

I/O

O(6)

UNSIGNED

I/O(4)

I/O

I

-

-

-

-

-

I/O(4)

LONG VARCHAR

I/O

I/O

I/O

I/O(1)

I/O(1)

I/O(2)

I/O(3)

I/O(3、5)

I/O

LONG VARRAW

I/O(6)

-

I(5、6)

-

-

-

I/O

I/O

I/O(6)

CHAR

I/O

I/O

I/O

I/O(1)

I/O(1)

I/O(2)

I/O(3)

I(3)

I/O

CHARZ

I/O

I/O

I/O

I/O(1)

I/O(1)

I/O(2)

I/O(3)

I(3)

I/O

ROWID記述子

I(1)

-

-

I/O

I/O

-

-

-

I(1)


凡例:

I = 入力時のみ有効な変換

O = 出力時のみ有効な変換

I/O = 入力時または出力時に有効な変換

注意:

(1) 入力時、ホスト文字列はOracle ROWID/UROWID形式であることが必要です。

出力時、列値はOracle ROWID/UROWID形式で戻されます。

(2) 入力時、ホスト文字列はOracle DATE文字形式であることが必要です。

出力時、列値はOracle DATE形式で戻されます。

(3) 入力時、ホスト文字列は16進フォーマットであることが必要です。

出力時、列値は16進フォーマットで戻されます。

(4) 出力時、列値が有効な数値を表している必要があります。

(5) 長さは2000以下であることが必要です。

(6) 入力時、列値は16進フォーマットで格納されます。

出力時、列値は16進フォーマットであることが必要です。

LOBデータ型記述子のデータ変換

表3-6「LOBのデータ変換」では、LOBのデータ変換を示しています。

表3-6 LOBのデータ変換

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

VARCHAR

I/O

 


CHAR

I/O

 


LONG

I/O

 


LONG VARCHAR

I/O

 


RAW

 


I/O

VARRAW

 


I/O

LONG RAW

 


I/O

LONG VARRAW

 


I/O


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

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

表3-7「日時および時間隔データ型のデータ変換」を次に示します。

表3-7 日時および時間隔データ型のデータ変換

外部データ型/内部データ型 VARCHAR、CHAR DATE TS TSTZ TSLTZ INTERVAL YEAR TO MONTH INTERVAL DAY TO SECOND

VARCHAR2、CHAR

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

-

-

OCI DATE

I/O

I/O

I/O

I/O

I/O

-

-

ANSI DATE

I/O

I/O

I/O

I/O

I/O

-

-

TIMESTAMP(TS)

I/O

I/O

I/O

I/O

I/O

-

-

TIMESTAMP WITH TIME ZONE(TSTZ)

I/O

I/O

I/O

I/O

I/O

-

-

TIMESTAMP WITH LOCAL TIME ZONE(TSLTZ)

I/O

I/O

I/O

I/O

I/O

-

-

INTERVAL YEAR TO MONTH

I/O

-

-

-

-

I/O

-

INTERVAL DAY TO SECOND

I/O

-

-

-

-

-

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文字形式であることが必要です。

日時および時間隔型のデータ変換に関する注意

(1) TSLTZからCHAR、DATE、TIMESTAMPおよびTSTZに変換すると、値はセッションのタイム・ゾーンに合わせて調整されます。

(2) CHARDATEおよびTIMESTAMPTSLTZに変換すると、セッションのタイム・ゾーンはメモリー内に格納されます。

(3) TSLTZANSI DATEに変換すると、TIME部分には0(ゼロ)が設定されます。

(4) TSTZを変換すると、タイム・スタンプを含むタイム・ゾーンはメモリー内に格納されます。

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

日時および日付のアップグレード規則

OCIでは、日時列および日付列について、クライアント・アプリケーションとデータベース・サーバー間の完全な上位互換性および下位互換性を備えています。

リリース1(9.0.1)より前のクライアントとリリース1(9.0.1)以上のサーバー

リリース1(9.0.1)より前のアプリケーションで使用できる日時データ型は、DATEデータ型のSQLT_DATのみです。バッファをSQLT_DATに定義したリリース1(9.0.1)より前のクライアントでTSLTZ列からデータを取得しようとすると、値の日付部分のみがクライアントに戻されます。

リリース1(9.0.1)より前のサーバーとリリース1(9.0.1)以上のクライアント

このケースでは、新しいクライアントにSQLT_TIMESTAMP_LTZ型のバインド・バッファまたは定義バッファがある場合があります。この場合は、次の互換性が維持されます。

クライアント・アプリケーションで、SQLT_TIMESTAMP_LTZ(または新しい日時データ型)をDATE列に挿入しようとすると、データが失われる可能性があるため、エラーが発生します。

クライアントにSQLT_TIMESTAMP_LTZデータ型のOUTバインド・バッファまたは定義バッファがあり、サーバー側の基礎となるSQLバッファまたは列がDATE型の場合は、セッションのタイム・ゾーンが割り当てられます。

OCIでのBINARY_FLOATおよびBINARY_DOUBLEのデータ変換

表3-8に、内部数値データ型と関連するすべての外部型の間でサポートされている変換を示します。(I)は変換が入力のみ(バインドのみ)に有効であることを示し、(O)は変換が出力のみ(定義)に有効であることを示します。これに対して、(I/O)は変換が入力と出力(バインドおよび定義)の両方に有効であることを示します。

表3-8 外部データ型から内部数値データ型へのデータ変換

外部データ型/内部データ型 BINARY_FLOAT BINARY_DOUBLE

VARCHAR

I/O

I/O

VARCHAR2

I/O

I/O

NUMBER

I/O

I/O

INTEGER

I/O

I/O

FLOAT

I/O

I/O

STRING

I/O

I/O

VARNUM

I/O

I/O

LONG

I/O

I/O

UNSIGNED INT

I/O

I/O

LONG VARCHAR

I/O

I/O

CHAR

I/O

I/O

BINARY_FLOAT

I/O

I/O

BINARY_DOUBLE

I/O

I/O


表3-9に、関連するすべての内部型と外部数値データ型の間でサポートされている変換を示します。(I)は変換が入力のみ(バインド)に有効であることを示し、(O)は変換が出力のみ(定義の場合のみ)に有効であることを示します。これに対して、(I/O)は変換が入力と出力(バインドおよび定義)の両方に有効であることを示します。

表3-9 内部データ型から外部数値データ型へのデータ変換

内部データ型/外部データ型 システム固有のfloat システム固有のdouble

VARCHAR2

I/O

I/O

NUMBER

I/O

I/O

LONG

I

I

CHAR

I/O

I/O

BINARY_FLOAT

I/O

I/O

BINARY_DOUBLE

I/O

I/O


型コード

Oracleの型はそれぞれ、スカラー、コレクション、参照、オブジェクト型のいずれであっても、他と重複しない型コードと関連付けられています。この型コードで型を識別します。また、この型コードはオブジェクト型属性についての情報を管理するためにOracleで使用されます。この型コード・システムは、汎用的で拡張可能に設計されており、Oracleデータ型への1対1の直接マップには連結されていません。次のSQL文で考えてみます。

CREATE TYPE my_type AS OBJECT
( attr1    NUMBER,
  attr2    INTEGER,
  attr3    SMALLINT);

CREATE TABLE my_table AS TABLE OF my_type;

これらの文では、オブジェクト型とオブジェクト表を作成します。作成された際に、my_tableには3つの列がありますが、これらはすべてOracle NUMBER型となります。これは、SMALLINTINTEGERが内部的にNUMBERにマップするためです。ただし、my_typeの属性の内部表現は、これら3つの属性のデータ型の区別を次のように維持します。attr1OCI_TYPECODE_NUMBERattr2OCI_TYPECODE_INTEGER、そしてattr3OCI_TYPECODE_SMALLINTです。アプリケーションでmy_typeを記述する場合、これらの型コードが戻されます。

OCITypeCodeは、型コードのCデータ型です。型コードは、OCIObjectNew()(どの型のオブジェクトが作成されたかを判断するのに役立つ)などの一部のOCI関数で使用されます。また、オブジェクトが記述されるとき、いくつかの属性の値としても戻されます。たとえば、OCI_ATTR_TYPECODE属性の型の問合せを行うと、OCITypeCodeの値が戻ります。

表3-10は、OCITypeCodeに可能な値を示しています。各Oracleデータ型に対応する値があります。

表3-10 OCITypeCodeの値とデータ型

データ型

OCI_TYPECODE_REF

REF

OCI_TYPECODE_DATE

DATE

OCI_TYPECODE_TIMESTAMP

TIMESTAMP

OCI_TYPECODE_TIMESTAMP_TZ

TIMESTAMP WITH TIME ZONE

OCI_TYPECODE_TIMESTAMP_LTZ

TIMESTAMP WITH LOCAL TIME ZONE

OCI_TYPECODE_INTERVAL_YM

INTERVAL YEAR TO MONTH

OCI_TYPECODE_INTERVAL_DS

INTERVAL DAY TO SECOND

OCI_TYPECODE_REAL

単精度実数

OCI_TYPECODE_DOUBLE

倍精度実数

OCI_TYPECODE_FLOAT

浮動小数点

OCI_TYPECODE_NUMBER

Oracle NUMBER

OCI_TYPECODE_BFLOAT

BINARY_FLOAT

OCI_TYPECODE_BDOUBLE

BINARY_DOUBLE

OCI_TYPECODE_DECIMAL

10進数

OCI_TYPECODE_OCTET

8進数

OCI_TYPECODE_INTEGER

INTEGER

OCI_TYPECODE_SMALLINT

SMALL INT

OCI_TYPECODE_RAW

RAW

OCI_TYPECODE_VARCHAR2

ANSI SQLの可変文字列、すなわちVARCHAR2

OCI_TYPECODE_VARCHAR

Oracle SQLの可変文字列、すなわちVARCHAR

OCI_TYPECODE_CHAR

SQL内部の固定長文字列、すなわちSQL CHAR

OCI_TYPECODE_VARRAY

可変長配列(VARRAY)

OCI_TYPECODE_TABLE

多重集合

OCI_TYPECODE_CLOB

キャラクタ・ラージ・オブジェクト(CLOB)

OCI_TYPECODE_BLOB

バイナリ・ラージ・オブジェクト(BLOB)

OCI_TYPECODE_BFILE

バイナリ・ラージ・オブジェクト・ファイル(BFILE

OCI_TYPECODE_OBJECT

名前付きオブジェクト型、またはSYS.XMLType

OCI_TYPECODE_NAMEDCOLLECTION

ドメイン(名前付き基本型)


SQLT値およびOCI_TYPECODE値の関係

2種類のデータ型コード値のセットを認識します。これらのセットの1つはSQLT_接頭辞、もう1つはOCI_TYPECODE_接頭辞によって区別されます。

SQLT型コードは、バインド操作または定義操作でデータ型を指定するために、OCIで使用されます。これにより、OracleとOCIクライアント・アプリケーション間のデータ変換を制御できます。OCI_TYPECODE型は、ユーザー定義型を操作または作成する際に、Oracleの型システムで事前定義済の型を参照または記述するために使用します。

多くの場合、SQLT値とOCI_TYPECODE値の間で、ダイレクト・マッピングがあります。ただし、1対1のダイレクト・マッピングがない場合もあります。たとえば、OCI_TYPECODE_SIGNED16OCI_TYPECODE_SIGNED32OCI_TYPECODE_INTEGEROCI_TYPECODE_OCTETおよびOCI_TYPECODE_SMALLINTはすべて、SQLT_INT型にマップされます。

表3-11では、SQLT型とOCI_TYPECODE型の間のマッピングを示します。

表3-11 OCI_TYPECODEからSQLTへのマップ

Oracle型システムの型名 Oracle型システムの型 等価SQLT型

BFILE

OCI_TYPECODE_BFILE

SQLT_BFILE

BLOB

OCI_TYPECODE_BLOB

SQLT_BLOB

CHAR

OCI_TYPECODE_CHAR(n)

SQLT_AFC(n) [注意1]

CLOB

OCI_TYPECODE_CLOB

SQLT_CLOB

COLLECTION

OCI_TYPECODE_NAMEDCOLLECTION

SQLT_NCO

DATE

OCI_TYPECODE_DATE

SQLT_DAT

TIMESTAMP

OCI_TYPECODE_TIMESTAMP

SQLT_TIMESTAMP

TIMESTAMP WITH TIME ZONE

OCI_TYPECODE_TIMESTAMP_TZ

SQLT_TIMESTAMP_TZ

TIMESTAMP WITH LOCAL TIME ZONE

OCI_TYPECODE_TIMESTAMP_LTZ

SQLT_TIMESTAMP_LTZ

INTERVAL YEAR TO MONTH

OCI_TYPECODE_INTERVAL_YM

SQLT_INTERVAL_YM

INTERVAL DAY TO SECOND

OCI_TYPECODE_INTERVAL_DS

SQLT_INTERVAL_DS

FLOAT

OCI_TYPECODE_FLOAT (b)

SQLT_FLT(8) [注意2]

DECIMAL

OCI_TYPECODE_DECIMAL (p)

SQLT_NUM(p, 0) [注意3]

DOUBLE

OCI_TYPECODE_DOUBLE

SQLT_FLT (8)

BINARY_FLOAT

OCI_TYPECODE_BFLOAT

SQLT_BFLOAT

BINARY_DOUBLE

OCI_TYPECODE_BDOUBLE

SQLT_BDOUBLE

INTEGER

OCI_TYPECODE_INTEGER

SQLT_INT (i) [注意4]

NUMBER

OCI_TYPECODE_NUMBER(p, s)

SQLT_NUM(p, s) [注意5]

OCTET

OCI_TYPECODE_OCTET

SQLT_INT (1)

POINTER

OCI_TYPECODE_PTR

<なし>

RAW

OCI_TYPECODE_RAW

SQLT_LVB

REAL

OCI_TYPECODE_REAL

SQLT_FLT (4)

REF

OCI_TYPECODE_REF

SQLT_REF

OBJECTまたはSYS.XMLType

OCI_TYPECODE_OBJECT

SQLT_NTY

SIGNED(8)

OCI_TYPECODE_SIGNED8

SQLT_INT (1)

SIGNED(16)

OCI_TYPECODE_SIGNED16

SQLT_INT (2)

SIGNED(32)

OCI_TYPECODE_SIGNED32

SQLT_INT (4)

SMALLINT

OCI_TYPECODE_SMALLINT

SQLT_INT (i) [注意4]

TABLE [注意6]

OCI_TYPECODE_TABLE

<なし>

TABLE(索引付き表)

OCI_TYPECODE_ITABLE

SQLT_TAB

UNSIGNED(8)

OCI_TYPECODE_UNSIGNED8

SQLT_UIN (1)

UNSIGNED(16)

OCI_TYPECODE_UNSIGNED16

SQLT_UIN (2)

UNSIGNED(32)

OCI_TYPECODE_UNSIGNED32

SQLT_UIN (4)

VARRAY [注意6]

OCI_TYPECODE_VARRAY

<なし>

VARCHAR

OCI_TYPECODE_VARCHAR (n)

SQLT_CHR (n) [注意1]

VARCHAR2

OCI_TYPECODE_VARCHAR2 (n)

SQLT_VCS (n) [注意1]


注意:

1. nはバイト単位の文字列サイズです。

2. これらは浮動小数点数で、精度は2進数での桁数です。bは、2進数数値の精度です。

3. これは小数点以下の数値を伴わないNUMBERと等価です。

4. iはバイト単位の数値サイズで、OCIコールの一部として設定されます。

5. pは10進数での数値の精度です。sは10進数での数値のスケール(位取り)です。

6. 名前付きコレクション型の一部としてのみ可能です。

oratypes.hの定義

このマニュアルでは、全体を通してub2sb4などのデータ型、またはUB4MAXVALなどの定数を参照することができます。これらの型は、publicディレクトリにあるoratypes.hヘッダー・ファイルで定義されます。正確な内容は、使用しているオペレーティング・システムによって異なります。


注意:


oratypes.hでのデータ型の使用は、OCIにパラメータを渡す手段としてサポートされています。