プライマリ・コンテンツに移動
Oracle® Call Interfaceプログラマーズ・ガイド
12c リリース1 (12.1)
B72465-07
目次へ移動
目次
索引へ移動
索引

前
次

3 データ型

この章は、OCIアプリケーションで使用するOracle外部データ型についてのリファレンスです。

この章では、Oracleデータ型、および独自に作成したプログラムとOracle Databaseの間でデータを転送する場合に行われる、データの内部表現と外部表現の変換についても説明します。

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

Oracleデータ型

OCIプログラムの重要な機能の1つは、Oracle Databaseと通信を行うことです。

OCIアプリケーションでは、SQL SELECTを使用した問合せによってデータベースの表からデータを取り出すか、INSERTUPDATEまたはDELETE文を使用して表内の既存データを変更します。

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

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

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

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

注意:

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

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

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

SELECT sal FROM emp WHERE empno = :employee_number

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

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

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

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

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

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

  • 内部Oracleデータ型は、Oracle Databaseの表の列で使用されます。これらには、PL/SQLで使用され、Oracle Databaseの列では使用されないデータ型も含まれます(たとえば、索引付き表、ブール、レコード)。

  • 外部OCIデータ型は、Oracleデータのホスト言語表現を指定するために使用されます。

  • OCI_TYPECODE値は、Oracle Databaseでオブジェクト型属性の型情報を表現するために使用されます。

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

関連項目:

外部データ型コードの使用について

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

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

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

関連項目:

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

内部データ型

内部データ型をリストし、説明します。

表3-1は、Oracle Database内部(組込み)データ型を各型の最大内部長およびデータ型コードとともに示しています。表3-10および表3-11に記載されているPL/SQL型も内部データ型とみなされます。

表3-1 Oracle Database内部データ型

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

VARCHAR2、NVARCHAR2

4000バイト(標準)

32767バイト(拡張)

1

NUMBER

21バイト

2

LONG

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

8

DATE

7バイト

12

RAW

2000バイト(標準)

32767バイト(拡張)

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

TIMESTAMPWITHTIMEZONE

13バイト

181

INTERVALYEARTOMONTH

5バイト

182

INTERVALDAYTOSECOND

11バイト

183

UROWID

3950バイト

208

TIMESTAMPWITHLOCALTIMEZONE

11バイト

231

関連項目:

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

LONG、RAW、LONG RAW、VARCHAR2

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

文字列およびバイト配列

文字またはバイト配列を含む列を指定する場合は、Oracle内部データ型を使用します。

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

注意:

LOBには文字を、BFILEにはバイナリ・データを含めることができます。これらは、他の型とは異なる処理がされるので、ここでは説明しません。

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

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

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

関連項目:

CHARVARCHAR2RAWLONGおよびLONG RAWの各データ型の詳細は、「LOBおよびBFILEの操作」を参照してください

UROWID

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

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

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

  • SQLT_CHR (VARCHAR2)

  • SQLT_VCS (VARCHAR)

  • SQLT_STR (NULL文字で終了する文字列)

  • SQLT_LVC(LONG VARCHAR)

  • SQLT_AFC (CHAR)

  • SQLT_AVC (CHARZ)

  • SQLT_VST (OCI文字列)

  • SQLT_RDD (ROWID記述子)

BINARY_FLOATおよびBINARY_DOUBLE

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

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

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

  • BINARY_FLOATSQLT_IBFLOAT

  • BINARY_DOUBLESQLT_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_VNU (VARNUM)

  • SQLT_CHR (VARCHAR2)

  • SQLT_VCS (VARCHAR)

  • SQLT_STR (NULL文字で終了する文字列)

  • SQLT_LVC(LONG VARCHAR)

  • SQLT_AFC (CHAR)

  • SQLT_AVC (CHARZ)

  • SQLT_VST (OCIString)

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

外部データ型

外部データ型のデータ型コードをリストし、説明します。

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

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

外部データ型 コード プログラム変数(1) 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

64ビット符号付きINTEGER

3

signed long、signed long long

SQLT_INT

FLOAT

4

float、double

SQLT_FLT

NULL文字で終了する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脚注 3

OCI DATE

156

OCIDate*

SQLT_ODT脚注 3

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

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

脚注 2

OTTで生成したデータ型マッピングを使用しているアプリケーションでは、CLOBはOCIClobLocatorとしてマッピングされ、BLOBはOCIBlobLocatorとしてマッピングされます。詳細は、第15章を参照してください。

脚注 3

これらのデータ型の使用方法の詳細は、第12章を参照してください。

VARCHAR2

VARCHAR2データ型は、最大長4000バイトの可変長文字列です。init.oraのパラメータがmax_string_size = standard (デフォルト値)の場合、VARCHAR2の最大長は4000バイトになります。init.oraのパラメータがmax_string_size = extendedの場合、VARCHAR2の最大長は32767バイトになります。

注意:

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

入力

OCIBindByName()またはOCIBindByPos()コールでは、value_szパラメータによって長さが決まります。拡張されたVARCHAR2長を使用している場合は、value_szパラメータによってOCIBindByName2()およびOCIBindByPos2()コールの長さが決まります。

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

注意:

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

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

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

出力

バインド関数および定義関数のvalue_szで、戻り値の希望の長さを指定する必要があります。

OCIDefineByPos()コールのvalue_szパラメータで、またはPL/SQLブロックの場合はOCIBindByName()またはOCIBindByPos()value_szパラメータで、戻り値の希望の長さを指定します。長さとしてゼロを指定した場合、データは戻されません。拡張されたVARCHAR2長を使用している場合は、value_szパラメータによって、OCIDefineByPos2()コール、またはPL/SQLブロックのOCIBindByName2()およびOCIBindByPos2()コールにおける戻り値の希望の長さが決まります。

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

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

NUMBER

NUMBERを外部データ型として使用する必要はありません。

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

注意:

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

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

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

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

関連項目:

64ビット整数ホスト・データ型

OCIアプリケーションで64ビットのネイティブ・ホスト変数および外部データ型としてのSQLT_INTまたはSQLT_UINを使用することにより、32ビット・サイズを超える(10桁以上の精度の)整数値をNUMBER列に対してバインドおよび定義できます。

リリース11.2以降、OCIでは、OCIアプリケーションで64ビットのネイティブ・ホスト変数および外部データ型としてのSQLT_INTまたはSQLT_UINを使用することにより、32ビット・サイズを超える(9桁以上の精度の)整数値をNUMBER列に対してフェッチおよ挿入できます。

この機能により、アプリケーションでは、すべてのプラットフォームでOCIバインドおよび定義関数コールにSQLT_INTまたはSQLT_UIN外部データ型を使用して、8バイトのネイティブ・ホスト変数をバインドおよび定義できます。OCIDefineByPos()またはOCIDefineByPos2()OCIBindByName()またはOCIBindByName2()、およびOCIBindByPos()またはOCIBindByPos2()関数コールでは、8バイトの整数データ型ポインタをvaluepパラメータとして指定できます。この機能により、大きい整数値(精度が最大18桁の10進数値)を、ネイティブ・ホスト変数に対して直接挿入およびフェッチし、これらの整数値に対してフリー演算を実行できます。

64ビット整数のOCIバインドおよび定義

例3-1は、エラーなく実行されるコードのフラグメントを示しています。

例3-1 64ビット整数のOCIバインドおよび定義のサポート

...
/* Variable declarations */
orasb8    sbigval1, sbigval2, sbigval3; // Signed 8-byte variables.
oraub8    ubigval1, ubigval2, ubigval3; // Unsigned 8-byte variables.
...
/* Bind Statements */
OCIBindByPos(..., (void *) &sbigval1, sizeof(sbigval1), ..., SQLT_INT, ...);
OCIBindByPos(..., (void *) &ubigval1, sizeof(ubigval1), ..., SQLT_UIN, ...);
OCIBindByName(...,(void *) &sbigval2, sizeof(sbigval2), ..., SQLT_INT, ...);
OCIBindByName(...,(void *) &ubigval2, sizeof(ubigval2), ..., SQLT_UIN, ...);
...
/* Define Statements */
OCIDefineByPos(..., (void *) &sbigval3, sizeof(sbigval3), ..., SQLT_INT, ...);
OCIDefineByPos(..., (void *) &ubigval3, sizeof(ubigval3), ..., SQLT_UIN, ...);
...

文を戻すOUTバインドDMLのサポート

例3-2は、文を戻すDMLのOUTバインドの8バイト整数データ型のバインドを説明するコード・フラグメントを示しています。

例3-2 文を戻すDMLのOUTバインドの8バイト整数データ型のバインド

...
/* Define SQL statements to be used in program. */
static text *dml_stmt = (text *) " UPDATE emp SET sal = sal + :1
                                   WHERE empno = :2
                                   RETURNING sal INTO :out1";
...
 
/* Declare all handles to be used in program. */
OCIStmt    *stmthp;
OCIError   *errhp;
OCIBind    *bnd1p   = (OCIBind *) 0;
OCIBind    *bnd2p   = (OCIBind *) 0;
OCIBind    *bnd3p   = (OCIBind *) 0;
...
 
/* Bind variable declarations */
orasb8    sbigval;   // OUT bind variable (8-byte size).
sword     eno, hike; // IN bind variables.
...
 
/* get values for IN bind variables */
...
 
/* Bind Statements */
OCIBindByPos(stmthp, &bnd1p, errhp, 1, (dvoid *) &hike,
            (sb4) sizeof(hike), SQLT_INT, (dvoid *) 0, 
            (ub2 *) 0, (ub2 *) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT);
OCIBindByPos(stmthp, &bnd2p, errhp, 2, (dvoid *) &eno,
            (sb4) sizeof(eno), SQLT_INT, (dvoid *) 0, 
            (ub2 *) 0, (ub2 *) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT);
OCIBindByName(stmthp, &bnd3p, errhp, (text *) ":out1", -1, 
             (dvoid *) &sbigval, sizeof(sbigval), SQLT_INT, (dvoid *) 0,
             (ub2 *) 0, (ub2 *) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT);
...
 
/* Use the returned OUT bind variable value */
...

INTEGER

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

FLOAT

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

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

注意:

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

STRING

NULL文字で終了するSTRING形式は、文字列にNULL終端文字が必要であることを除けば、VARCHAR2形式と同じように動作します。

STRINGデータ型は、特にC言語のプログラムで有用です。

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

入力

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

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

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

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

注意:

NULLで終了する文字列の文字列長パラメータに、-1を渡すことはできません。

出力

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

NULL選択リスト項目では、最初の文字の位置に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)を100で除算して100を加算した整数値119が格納されます。2番目のバイトには、年のモジュロ100に100を加算した192が格納されます。BCE (西暦紀元前)の日付は99以下です。紀元は01-JAN-4712 BCE、つまりユリウス日1から始まります。この日付では、世紀バイトは53、年号バイトは88です。時間、分および秒のバイトは1を加えた表記です。時間のバイトの範囲は1から24で、分と秒のバイトの範囲は1から60です。日付が作成された際に時刻が指定されていない場合、時刻のデフォルト値は午前0時です(1、1、1)。

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

注意:

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

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

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

関連項目:

RAW

RAWデータ型は、たとえば図形文字列の格納など、Oracle Databaseで解釈されないバイナリ・データまたはバイト列で使用されます。RAW列の最大長は2000バイトです。init.oraのパラメータがmax_string_size = standard (デフォルト値)の場合、RAWの最大長は2000バイトになります。init.oraのパラメータがmax_string_size = extendedの場合、RAWの最大長は32767バイトになります。

関連項目:

Oracle Database SQL言語リファレンス

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

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

Oracle Databaseでオブジェクトを使用する場合は、一連の事前定義済OCI関数を使用して、特殊なOCIRawデータ型を扱うことができます。このデータ型の詳細は、「ロー(OCIRaw)」を参照してください。

VARRAW

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

LONG RAW

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

UNSIGNED

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

LONG VARCHAR

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

LONG VARRAW

LONG VARRAWデータ型は、Oracle Database 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を挿入しようとすると、Oracle Databaseでエラーが発生し、行は挿入されません。

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

入力時に、長さのパラメータは、NULL終端文字も含めた正確な長さを示す必要があります。たとえば、Cの配列が次のように宣言されたとすると、my_numのバインド時の長さのパラメータは7になっている必要があります。この例で他の値を指定すると、エラーが戻されます。

char my_num[] = "123.45";

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

注意:

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

名前付きデータ型: オブジェクト、VARRAY、ネストした表

名前付きデータ型は、SQLのCREATE TYPEコマンドで指定するユーザー定義の型です。

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

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

関連項目:

REF

これは名前付きデータ型への参照です。

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

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

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

関連項目:

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記述子を使用して行い、この記述子はバインド変数または定義変数として使用できます。

関連項目:

LOB記述子

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

バイナリ・データはBLOB (バイナリLOB)に格納され、文字データは、CLOB (キャラクタLOB)またはNCLOB (各国語キャラクタLOB)に格納されます。

LOB値は、データベースの行データとともに、インラインに格納される場合とされない場合があります。いずれの場合も、LOBは、Oracle Databaseのトランザクションを完全にサポートしています。データベース表には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値をパラメータとして受け取ることはありません。

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

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

  • SQLT_CLOB: 文字LOBデータ型

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

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

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

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

関連項目:

BFILE

Oracle Databaseでは、バイナリ・ファイル(BFILE)へのアクセスをサポートします。

BFILEデータ型は、Oracle Database外部のファイル・システムに格納されているLOBにアクセスできます。

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

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

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

BFILEデータ型では、大きなバイナリ・ファイルの読取り専用サポートが可能ですが、Oracle Databaseからファイルを変更することはできません。Oracle Databaseには、ファイル・データにアクセスするための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の各国語キャラクタ・バージョンです。これは、固定幅、シングルバイト、マルチバイトの各国語キャラクタ・セット(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に割り当てると、時間部分は無視されます。

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です。この値はナノ秒単位で指定する必要があります。表の作成時に有効桁数が別の値に指定されていなければ、デフォルトのDAY TO SECONDの有効桁数は6です。この場合、最下位の3桁は切り捨てられます。

日時を使用した予期しない結果の回避について

注意:

日時データのデータ操作言語(DML)の操作での予期しない結果を回避するために、組込みSQL関数のDBTIMEZONESESSIONTIMEZONEを問い合せて、データベースとセッションのタイム・ゾーンを確認できます。タイム・ゾーンを手動で設定していない場合、デフォルトでオペレーティング・システムのタイム・ゾーンが使用されます。オペレーティング・システムのタイム・ゾーンが有効なOracle Databaseタイム・ゾーンでない場合、UTCがデフォルト値として使用されます。

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

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

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

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

OCIでは、ユーザー定義のデータ型をC表現にマッピングするために使用される、Oracle定義のCデータ型がサポートされています(OCINumberOCIArrayなど)。

OCIには、これらのデータ型で動作し、これらのデータ型をOCI外部データ型とともに、バインド操作および定義操作で使用する一連のOCIコールが用意されています。

関連項目:

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

データ変換

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

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

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

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

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

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

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

関連項目:

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

表3-5 データ変換

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

VARCHAR2

I/O脚注 5

I/O

I/O

I/O脚注 6

I/O脚注 6

I/O脚注 7

I/O脚注 8

I/O脚注 8

NA

NUMBER

I/O脚注 9

I/O

I脚注 10

NA

NA

NA

NA

NA

I/O脚注 9

INTEGER

I/O脚注 9

I/O

I

NA

NA

NA

NA

NA

I/O脚注 9

FLOAT

I/O脚注 9

I/O

I

NA

NA

NA

NA

NA

I/O脚注 9

STRING

I/O

I/O

I/O

I/O脚注 6

I/O脚注 6

I/O脚注 7

I/O脚注 8

I/O脚注 8脚注 11

I/O

VARNUM

I/O脚注 9

I/O

I

NA

NA

NA

NA

NA

I/O脚注 9

DECIMAL

I/O脚注 9

I/O

I

NA

NA

NA

NA

NA

I/O脚注 9

LONG

I/O

I/O

I/O

I/O脚注 6

I/O脚注 6

I/O脚注 7

I/O脚注 8

I/O脚注 8脚注 11

I/O

VARCHAR

I/O

I/O

I/O

I/O脚注 6

I/O脚注 6

I/O脚注 7

I/O脚注 8

I/O脚注 8脚注 11

I/O

DATE

I/O

NA

I

NA

NA

I/O

NA

NA

I/O

VARRAW

I/O脚注 12

NA

I脚注 11脚注 12

NA

NA

NA

I/O

I/O

I/O脚注 12

RAW

I/O脚注 12

NA

I脚注 11脚注 12

NA

NA

NA

I/O

I/O

I/O脚注 12

LONG RAW

O脚注 13脚注 12

NA

I脚注 11脚注 12

NA

NA

NA

I/O

I/O

O脚注 12

UNSIGNED

I/O脚注 9

I/O

I

NA

NA

NA

NA

NA

I/O脚注 9

LONG VARCHAR

I/O

I/O

I/O

I/O脚注 6

I/O脚注 6

I/O脚注 7

I/O脚注 8

I/O脚注 8脚注 11

I/O

LONG VARRAW

I/O脚注 12

NA

I脚注 11脚注 12

NA

NA

NA

I/O

I/O

I/O脚注 12

CHAR

I/O

I/O

I/O

I/O脚注 6

I/O脚注 6

I/O脚注 7

I/O脚注 8

I脚注 8

I/O

CHARZ

I/O

I/O

I/O

I/O脚注 6

I/O脚注 6

I/O脚注 7

I/O脚注 8

I脚注 8

I/O

ROWID記述子

I脚注 6

NA

NA

I/O

I/O

NA

NA

NA

I脚注 6

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

脚注 5

I/O = 入力または出力に対して変換が有効です。

脚注 6

入力時、ホスト文字列はOracle ROWID/UROWID形式であることが必要です。出力時、列値はOracle ROWID/UROWID形式で戻されます。

脚注 7

入力時、ホスト文字列はOracle DATE文字形式であることが必要です。出力時、列値はOracle DATE形式で戻されます。

脚注 8

入力時には、ホスト文字列を16進数の形式にする必要があります。出力時、列値は16進フォーマットで戻されます。

脚注 9

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

脚注 10

I = 入力に対してのみ変換が有効です。

脚注 11

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

脚注 12

入力時には、列値は16進数の形式で格納されます。出力時、列値は16進フォーマットであることが必要です。

脚注 13

O = 出力に対してのみ変換が有効です。

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

表3-6では、LOBのデータ変換を示しています。たとえば、外部文字データ型(VARCHARCHARLONGおよびLONG VARCHAR)は、内部CLOBデータ型に変換されるのに対して、外部RAWデータ型(RAWVARRAWLONG RAWおよびLONG VARRAW)は、内部BLOBデータ型に変換されます。

表3-6 LOBのデータ変換

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

VARCHAR

I/O脚注 14

NA脚注 15

CHAR

I/O

NA

LONG

I/O

NA

LONG VARCHAR

I/O

NA

RAW

NA

I/O

VARRAW

NA

I/O

LONG RAW

NA

I/O

LONG VARRAW

NA

I/O

脚注 14

I/O = 入力または出力に対して変換が有効です。

脚注 15

NAは適用されないことを意味します。

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

日時および時間隔データ型のデータ変換を示します。

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

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

外部データ型/内部データ型 VARCHAR、CHAR DATE TS TSTZ TSLTZ INTERVALYEARTOMONTH INTERVALDAYTOSECOND

VARCHAR2、CHAR

I/O脚注 16

I/O

I/O

I/O

I/O

I/O

I/O

DATE

I/O

I/O

I/O

I/O

I/O

NA脚注 17

NA

OCI 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

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

INTERVALDAYTOSECOND

I/O

NA

NA

NA

NA

NA

I/O

脚注 16

I/O = 入力または出力に対して変換が有効です。

脚注 17

NAは適用されないことを意味します。

代入に関する注意

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

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

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

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

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

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

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

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

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

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

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

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

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

9.0より前のクライアントと9.0以上のサーバー

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

9.0より前のサーバーと9.0以上のクライアント

9.0より前のサーバーを9.0以上のクライアントとともに使用する場合、クライアントに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脚注 18

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

脚注 18

(I/O)は変換が入力と出力(バインドおよび定義)の両方に有効であることを示します

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

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

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

VARCHAR2

I/O脚注 19

I/O

NUMBER

I/O

I/O

LONG

I脚注 20

I

CHAR

I/O

I/O

BINARY_FLOAT

I/O

I/O

BINARY_DOUBLE

I/O

I/O

脚注 19

(I/O)は変換が入力と出力(バインドおよび定義)の両方に有効であることを示します

脚注 20

(I)は変換が入力のみ(バインドのみ)に有効であることを示します

型コード

固有の型コードは、Oracle Databaseのスカラー、コレクション、参照またはオブジェクトの各型に関連付けられています。

型コードは型を識別し、オブジェクト型属性に関する情報を管理するためにOracle Databaseが使用します。この型コード・システムは、汎用および拡張可能として設計されています。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にはすべてOracle NUMBER型の3つの列が生成されますが、これはSMALLINTおよびINTEGERが内部的に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

TIMESTAMPWITHTIMEZONE

OCI_TYPECODE_TIMESTAMP_LTZ

TIMESTAMPWITHLOCALTIMEZONE

OCI_TYPECODE_INTERVAL_YM

INTERVALYEARTOMONTH

OCI_TYPECODE_INTERVAL_DS

INTERVALDAYTOSECOND

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

コレクション

OCI_TYPECODE_BOOLEAN脚注 21

ブール

OCI_TYPECODE_RECORD脚注 21

レコード

OCI_TYPECODE_ITABLE脚注 21

索引付きBINARY_INTEGER

OCI_TYPECODE_INTEGER脚注 21

PLS_INTEGERまたはBINARY_INTEGER

脚注 21

このデータ型は、PL/SQLデータ型のみです。

この項には次のトピックが含まれます。「SQLT値およびOCI_TYPECODE値の関係」

SQLT値およびOCI_TYPECODE値の関係

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

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

多くの場合、SQLT値とOCI_TYPECODE値の間で、ダイレクト・マッピングがあります。ただし、1対1のダイレクト・マッピングがない場合もあります。たとえば、OCI_TYPECODE_SIGNED8OCI_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

BOOLEAN脚注 22

OCI_TYPECODE_BOOLEAN

SQLT_BOL

CHAR

OCI_TYPECODE_CHAR(n)

SQLT_AFC(n)脚注 23

CLOB

OCI_TYPECODE_CLOB

SQLT_CLOB

COLLECTION

OCI_TYPECODE_NAMEDCOLLECTION

SQLT_NCO

DATE

OCI_TYPECODE_DATE

SQLT_DAT

TIMESTAMP

OCI_TYPECODE_TIMESTAMP

SQLT_TIMESTAMP

TIMESTAMPWITHTIMEZONE

OCI_TYPECODE_TIMESTAMP_TZ

SQLT_TIMESTAMP_TZ

TIMESTAMPWITHLOCALTIMEZONE

OCI_TYPECODE_TIMESTAMP_LTZ

SQLT_TIMESTAMP_LTZ

INTERVALYEARTOMONTH

OCI_TYPECODE_INTERVAL_YM

SQLT_INTERVAL_YM

INTERVALDAYTOSECOND

OCI_TYPECODE_INTERVAL_DS

SQLT_INTERVAL_DS

FLOAT

OCI_TYPECODE_FLOAT (b)

SQLT_FLT (8)脚注 24

DECIMAL

OCI_TYPECODE_DECIMAL (p)

SQLT_NUM (p, 0)脚注 25

DOUBLE

OCI_TYPECODE_DOUBLE

SQLT_FLT (8)

BINARY_FLOAT

OCI_TYPECODE_BFLOAT

SQLT_BFLOAT

BINARY_DOUBLE

OCI_TYPECODE_BDOUBLE

SQLT_BDOUBLE

INDEX-BY BINARY_INTEGER脚注 21

OCI_TYPECODE_ITABLE

SQLT_NTY

INTEGER

OCI_TYPECODE_INTEGER

SQLT_INT (i)脚注 26

NUMBER

OCI_TYPECODE_NUMBER(p, s)

SQLT_NUM (p, s)脚注 27

OCTET

OCI_TYPECODE_OCTET

SQLT_INT (1)

PLS_INTEGERまたはBINARY_INTEGER脚注 21

OCI_TYPECODE_PLS_INTEGER

SQLT_INT

POINTER

OCI_TYPECODE_PTR

<なし>

RAW

OCI_TYPECODE_RAW

SQLT_LVB

REAL

OCI_TYPECODE_REAL

SQLT_FLT (4)

REF

OCI_TYPECODE_REF

SQLT_REF

RECORD脚注 21

OCI_TYPECODE_RECORD

SQLT_NTY

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)脚注 26

TABLE脚注 28

OCI_TYPECODE_TABLE

<なし>

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脚注 28

OCI_TYPECODE_VARRAY

<なし>

VARCHAR

OCI_TYPECODE_VARCHAR (n)

SQLT_CHR (n)脚注 23

VARCHAR2

OCI_TYPECODE_VARCHAR2 (n)

SQLT_VCS (n)脚注 23

脚注 22

このデータ型は、PL/SQLデータ型のみです。

脚注 23

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

脚注 24

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

脚注 25

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

脚注 26

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

脚注 27

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

脚注 28

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

oratypes.hの定義

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

注意:

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