この章は、OCIアプリケーションで使用するOracle外部データ型についてのリファレンスです。この章では、Oracleデータ型、および独自に作成したプログラムとOracle Databaseの間でデータを転送する場合に行われる、データの内部表現と外部表現の変換についても説明します。
この章は、次の項目で構成されています。
関連項目: Oracle内部データ型の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
OCIプログラムの重要な機能の1つは、Oracle Databaseと通信を行うことです。OCIアプリケーションでは、SQL SELECT
を使用した問合せによってデータベースの表からデータを取り出すか、INSERT
、UPDATE
またはDELETE
文を使用して表内の既存データを変更します。
データベース内では、値は表の列に格納されています。内部的には、Oracleは内部データ型という特別な形式でデータを表現します。内部データ型の例として、NUMBER
、CHAR
、DATE
などがあります(表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()コールで、dty
パラメータのVARCHAR2
(コード= 1)またはCHAR
(コード= 96)など、Oracle Database外部文字列データ型を指定します。また、プログラムで文字列変数を宣言し、そのアドレスをvaluep
パラメータで指定する必要があります。詳細は、表3-2を参照してください。
ただし、給与情報を2進数浮動小数点値として戻す場合は、FLOAT
(コード= 4)外部データ型を指定します。また、valuep
パラメータに適切な型の変数を定義する必要があります。
ほとんどのデータ変換が透過的に実行されます。また、ほとんどすべての外部データ型を指定できるため、特殊なタスクを実行できます。たとえば、DATE
外部データ型を使用すると、文字変換を行わずに純粋なバイナリ形式で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-1は、Oracle Database内部(組込み)データ型を各型の最大内部長およびデータ型コードとともに示しています。
表3-1 Oracle Database内部データ型
関連項目: これらの組込みデータ型の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
OCIBindByName()、OCIBindByPos()、OCIDefineByPos()、OCIStmtGetPieceInfo()およびOCIStmtSetPieceInfo()によって提供されるピース単位機能を使用すると、LONG
、RAW
、LONG RAW
およびVARCHAR2
データ型の列データを扱う挿入、更新またはフェッチを実行できます。
文字またはバイト配列を含む列を指定する場合は、CHAR
、VARCHAR2
、RAW
、LONG
およびLONG
RAW
の5つのOracle Database内部データ型を使用できます。
通常、CHAR
列、VARCHAR2
列およびLONG
列には文字データが入ります。RAW
およびLONG
RAW
には、文字として解釈されないバイト(ビットマップ化された画像のピクセル値など)が入ります。ネットワーク間のゲートウェイを介して文字データを渡すと、文字データが変形する可能性があります。1文字を表現するバイト数が異なる別々の言語を使用しているマシン間で文字データを渡すと、長さが大きく変わる可能性があります。RAWデータがこのように変換されることはありません。
表の列ごとに適切なOracle内部データ型を選択するのは、データベースの設計者の責任です。OCIプログラマは、文字データおよびバイト配列データの表現方法、およびOCIプログラムの変数とOracle Database表の間でのデータの変換方法を多数知っておく必要があります。
配列に文字が入っている場合、OCIコール内の配列の長さを示すパラメータは、常に文字単位ではなくバイト単位で渡され、バイト単位で戻されます。
ユニバーサル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
データ型は、単精度浮動小数点値および倍精度浮動小数点値を表現し、主に、浮動小数点演算のIEEE754標準に準拠しています。
リリース10.1でこれらのデータ型が追加される前は、Oracle Database内の数値はすべて、Oracle NUMBER
書式で格納されていました。これらの新しいバイナリ浮動小数点型は、Oracle NUMBER
を置換するものではありません。Oracle NUMBER
の代替として機能するため、ディスク領域の使用量が少なくて済むという利点があります。
この内部型は、次のコードで表現されます。
次のホスト変数はすべて、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_BFLOAT
とSQLT_BDOUBLE
を使用します。
表3-2は、外部データ型のデータ型コードを示しています。この表ではデータ型ごとに、Oracle Database内部データの変換元または変換先となる、Cのプログラム変数の型を示しています。
表3-2 外部データ型とそのコード
外部データ型 | コード | プログラム変数脚注 1 | OCI定義の定数 |
---|---|---|---|
|
1 |
char[n] |
|
|
2 |
unsigned char[21] |
|
8ビット符号付き |
3 |
signed char |
|
16ビット符号付き |
3 |
signed short、signed int |
|
32ビット符号付き |
3 |
signed int、signed long |
|
64ビット符号付き |
3 |
signed long、signed long long |
|
|
4 |
float、double |
|
|
5 |
char[n+1] |
|
|
6 |
char[22] |
|
|
8 |
char[n] |
|
|
9 |
char[n+sizeof(short integer)] |
|
|
12 |
char[7] |
|
|
15 |
unsigned char[n+sizeof(short integer)] |
|
システム固有のfloat |
21 |
float |
|
システム固有のdouble |
22 |
double |
|
|
23 |
unsigned char[n] |
|
|
24 |
unsigned char[n] |
|
|
68 |
unsigned |
|
|
94 |
char[n+sizeof(integer)] |
|
|
95 |
unsigned char[n+sizeof(integer)] |
|
|
96 |
char[n] |
|
|
97 |
char[n+1] |
|
|
104 |
OCIRowid * |
|
名前付きデータ型 |
108 |
struct |
|
|
110 |
OCIRef |
|
キャラクタLOB記述子 |
112 |
OCILobLocator脚注 2 |
|
バイナリLOB記述子 |
113 |
OCILobLocator脚注 2 |
|
バイナリFILE記述子 |
114 |
OCILobLocator |
|
|
155 |
OCIString |
|
|
156 |
OCIDate* |
|
|
184 |
OCIDateTime * |
|
|
187 |
OCIDateTime * |
|
|
188 |
OCIDateTime * |
|
|
189 |
OCIInterval * |
|
|
190 |
OCIInterval * |
|
|
232 |
OCIDateTime * |
|
脚注 1 データ長がnとなっている場合、nは可変で、プログラム(ROWIDの場合はオペレーティング・システム)の要件に依存します。
脚注 2 OTTで生成したデータ型マッピングを使用しているアプリケーションでは、CLOBはOCIClobLocatorとしてマッピングされ、BLOBはOCIBlobLocatorとしてマッピングされます。詳細は、第15章を参照してください。
脚注 3 これらのデータ型の使用方法の詳細は、第12章を参照してください。
次の2つの型はPL/SQLに対する内部型で、OCIでは値として戻すことができません。
ブール、SQLT_BOL
レコード、SQLT_REC
VARCHAR2
データ型は、最大長4000バイトの可変長文字列です。
注意: Oracle Databaseオブジェクトを使用する場合は、一連の事前定義済OCI関数を使用することにより、特殊なOCIString 外部データ型を扱うことができます。このデータ型の詳細は、第12章を参照してください。 |
OCIBindByName()またはOCIBindByPos()コールでは、value_sz
パラメータによって長さが決まります。
value_sz
パラメータが0 (ゼロ)より大きい場合は、指定のバイト数のみがプログラムのバッファ・アドレスの先頭から読み取られて、バインド変数値が取得されます。後続の空白は削除され、結果の値はSQL文またはPL/SQLブロックで使用されます。INSERT
文の場合、結果の値がデータベース列で定義された長さより長いと、INSERT
は失敗しエラーが戻されます。
注意: 後続のNULL は除去されません。変数は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-1405
が戻されます。
NUMBER
を外部データ型として使用する必要はありません。使用すると、21バイトの内部バイナリ形式で数値が戻され、入力時にこの形式が必要になります。完全な情報が必要な場合は、次の説明を参照してください。
注意: Oracle Databaseでオブジェクトを使用する場合は、一連の事前定義済OCI関数を使用して、特殊なOCINumber データ型を扱うことができます。このデータ型の詳細は、「Number (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()コールのdty
パラメータにデータ型コード2を指定すると、プログラムではこのOracle内部形式で数値データを受け取ります。出力変数は、可能な最大の数値を格納できる21バイトの配列である必要があります。数値を表すバイトのみが戻されることに注意してください。空白埋めまたはNULL
文字終了はありません。戻されたバイト数を調べる場合は、NUMBER
ではなくVARNUM
外部型を使用します。
リリース11.2以降、OCIでは、OCIアプリケーションで64ビットのネイティブ・ホスト変数および外部データ型としてのSQLT_INT
またはSQLT_UIN
を使用することにより、32ビット・サイズを超える(9桁以上の精度の)整数値をNUMBER
列に対してフェッチおよ挿入できます。
この機能により、アプリケーションでは、すべてのプラットフォームでOCIバインドおよび定義関数コールにSQLT_INT
またはSQLT_UIN
外部データ型を使用して、8バイトのネイティブ・ホスト変数をバインドおよび定義できます。OCIDefineByPos()
、OCIBindByName()
およびOCIBindByPos()関数コールでは、8バイトの整数データ型ポインタをvaluep
パラメータとして指定できます。この機能により、大きい整数値(精度が最大18桁の10進数値)を、ネイティブ・ホスト変数に対して直接挿入およびフェッチし、これらの整数値に対してフリー演算を実行できます。
例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, ...); ...
例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は符号付きの2進数で、バイト単位のサイズはシステムによって異なります。変数内のバイトの順序は、ホスト・システム・アーキテクチャによって決まります。長さ指定は、入力でも出力でも必須です。Oracle Databaseから戻される数値が整数でない場合、小数部分は廃棄され、エラーやその他の情報は戻されません。戻される数値がシステムの符号付きINTEGERで表現できない場合は、「変換時にオーバーフローが発生しました(overflow on conversion)」エラーが戻されます。
FLOAT
データ型は、小数部分のある数値、またはINTEGERでは表現できない数値を処理します。数値はホスト・システムの浮動小数点書式で表されます。通常、長さは4バイトか8バイトのいずれかです。長さ指定は、入力および出力の両方について必要です。
Oracle Databaseの数値の内部形式は10進数で、大部分の浮動小数点は2進数であるため、数値を浮動小数点で表現するよりもより高い精度で表現できます。
注意: FLOAT およびNUMBER 間の変換時には丸め処理のエラーが発生する場合もあります。問合せでバインド変数としてFLOAT を使用すると、ORA-1403 エラーが戻されることがあります。この状況を回避するには、FLOAT をSTRING に変換し、VARCHAR2 またはNULL 終了文字列を設定します。 |
NULL
文字で終了するSTRING
形式は、文字列にNULL
終端文字が必要であることを除けば、VARCHAR2
形式と同じように動作します。このデータ型は、特にC言語のプログラムで有用です。
OCIBindByName()
またはOCIBindByPos()
コールで供給される文字列の長さによって、NULL
終端文字があるかどうかのスキャンの範囲が制限されます。NULL
終端文字が指定された中で見つからなかった場合は、次のエラーとなります。
ORA-01480: STR
バインド値に終了のNULL
がありません。
バインド・コールで長さが指定されていない場合、OCIは、文字列の暗黙の最大長の4000を使用します。
文字列の最小の長さは2バイトです。最初の文字がNULL
終端文字であり、長さが2と指定されている場合、許可されていればNULL
が列に挿入されます。VARCHAR2
型およびCHAR
型とは異なり、空白のみを含む文字列は入力時にNULL
として扱われるのではなく、そのまま挿入されます。
注意: NULL で終了する文字列の文字列長パラメータに、-1を渡すことはできません。 |
VARNUM
データ型は、最初のバイトに数値表現の長さが記述されることを除けば、外部NUMBER
データ型と同じです。この長さには、長さを記述するバイト自体は含まれません。最大長のVARNUM
に備えて、22バイトを確保してください。VARNUM
値をOracle Databaseに送信するときは、長さを記述するバイトを設定します。
表3-3に、表の数値に戻されるVARNUM
値の例をいくつか示します。
LONG
データ型では、4001バイト以上の文字列を格納します。LONG
列には、最大2GB (2^31-1バイト)を格納できます。この列の型は、長い文字列の格納およびフェッチにのみ使用します。関数、式またはWHERE
句では使用できません。一般的に、LONG
列値の変換は、文字列との間で行われます。
LONG
列を使用した表を作成しないでください。かわりに、LOB
列(CLOB
、NCLOB
またはBLOB
)を使用してください。LONG
列は、下位互換性のためにサポートされています。
既存のLONG
列をLOB
列に変換することもお薦めします。LOB
列の制限の数は、LONG
列の制限の数よりも、かなり少なくなっています。さらに、LOB
機能はすべてのリリースで拡張されていますが、LONG
機能は複数のリリースで変更されていません。
VARCHAR
データ型では、可変長の文字列が格納されます。先頭の2バイトには文字列の長さが記述され、残りのバイトには文字列が含まれます。バインド・コールまたは定義コールで指定する文字列の長さには、この2バイトを含める必要があるため、送受信可能なVARCHAR
文字列の最大長は、65535バイトではなく、65533バイトになります。
DATE
データ型では、Oracle内部日付バイナリ形式を使用して、日付の値の更新、挿入または検索を行うことができます。バイナリ形式の日付は、表3-4に示すとおり7バイトです。
世紀と年を表すバイト(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
データ型は、たとえば図形文字列の格納など、Oracle Databaseで解釈されないバイナリ・データまたはバイト列で使用されます。RAW
列の最大長は2000バイトです。
関連項目: 『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
データ型を扱うことができます。このデータ型の詳細は、「Raw (OCIRaw)」を参照してください。
VARRAW
データ型は、RAW
データ型に類似しています。ただし、先頭の2バイトにはデータの長さが記述されます。バインド・コールまたは定義コールで指定する文字列の長さには、この2バイトを含める必要があるため、送受信可能なVARRAW
文字列の最大長は、65535バイトではなく、65533バイトになります。これより長い文字列を変換する場合は、LONG
VARRAW
外部データ型を使用します。
UNSIGNED
データ型は、符号なし2進整数に対して使用されます。バイト単位のサイズは、システムによって異なります。ワード内のバイトの順序は、ホスト・システムのアーキテクチャによって決まります。長さ指定は、入力でも出力でも必須です。Oracle Databaseから出力される数値が整数でない場合、小数部分は廃棄され、エラーやその他の情報は戻されません。戻される数値がシステムの符号なし整数より大きくて表現できない場合、「変換時にオーバーフローが発生しました(overflow on conversion)」というエラーが戻されます。
LONG
VARCHAR
データ型は、Oracle DatabaseのLONG
列からデータを格納する場合、またはこの列にデータを格納する場合に使用します。LONG
VARCHAR
の先頭の4バイトには項目の長さが記述されます。したがって、格納される項目の最大長は、2^31-5バイトです。
LONG
VARRAW
データ型は、Oracle Database LONG
RAW
列からデータを格納する場合、またはこの列にデータを格納する場合に使用します。長さは、先頭の4バイトに記述されます。最大長は、2^31-5バイトです。
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
外部データ型は、入力時に文字列がNULL
文字で終了していること、および出力時にOracle Databaseによって文字列の最後にNULL
終端文字が配置されることを除けば、CHAR
データ型と同じです。NULL
終端文字は入出力時に文字列を区切るためのもので、表のデータの一部ではありません。
入力時に、長さのパラメータは、NULL
終端文字も含めた正確な長さを示す必要があります。たとえば、Cの配列が次のように宣言されたとすると、my_num
のバインド時の長さのパラメータは7になっている必要があります。この例で他の値を指定すると、エラーが戻されます。
char my_num[] = "123.45";
次の新しい外部データ型は、リリース8.0から導入されました。これらのデータ型は、Oracle7 Serverへ接続した場合にはサポートされません。
注意: 内部データ型および外部データ型は、いずれもそれぞれのデータ型コードに対応するOracle定義の定数値(SQLT_NTY 、SQLT_REF など)を含んでいます。この章に出てくるすべての型についての定数は示していませんが、この項では新しいOracleデータ型を説明する際に、それらの定数を使用します。また、データ型定数は、これらの新しい型を参照するときに、このマニュアルの他の章でも使用されます。 |
名前付きデータ型は、SQLのCREATE
TYPE
コマンドで指定するユーザー定義の型です。例として、オブジェクト型、VARRAY、NESTED TABLEなどがあります。OCIでは、名前付きデータ型は型のホスト言語による表現を意味します。SQLT_NTY
データ型コードは、名前付きデータ型をバインドまたは定義する際に使用します。
Cアプリケーションでは、名前付きデータ型はC構造体として表されます。このような構造体は、データベース内に格納された型からObject Type Translatorを使用して生成されます。これらの型は、OCI_TYPECODE_OBJECT
に対応します。
これは名前付きデータ型への参照です。REF
のC言語表現は、OCIRef *
型として宣言された変数です。SQLT_REF
データ型コードは、REF
をバインドまたは定義する際に使用します。
REF
にアクセスできるのは、OCIアプリケーションをオブジェクト・モードで初期化した場合のみです。サーバーからREF
が取り出されると、REFはクライアント側のオブジェクト・キャッシュに格納されます。
アプリケーションで使用するREF
を割り当てるには、変数をREF
へのポインタとして宣言し、OCI_TYPECODE_REF
をtypecode
パラメータとして渡すOCIObjectNew()をコールします。
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 (ラージ・オブジェクト)には、長さが最大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
)パラメータは常に、バイトではなく固定幅キャラクタ・セットの文字として解釈されます。
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
には、最大128TBのバイナリ・データを格納できます。
BLOB
はトランザクションを完全にサポートしており、OCIを通じて行った変更は、完全にトランザクションで使用できます。BLOB
値に対して行った操作は、コミットまたはロールバックできます。1つのトランザクション内で変数のBLOB
ロケータを保存し、次にそれを別のトランザクションまたはセッションで使用することはできません。
ここでは、日時および時間隔のデータ型記述子について簡単に説明します。
関連項目: 『Oracle Database SQL言語リファレンス』 |
ANSI
DATE
データ型はDATE
データ型が基本になっていますが、時間部分は含まれていません。タイム・ゾーンもありません。ANSI
DATE
は、DATE
データ型のANSI仕様に従います。ANSI
DATE
をDATE
データ型またはTIMESTAMPデータ型に割り当てると、OracleのDATE
やTIMESTAMPの時間部分は0(ゼロ)に設定されます。DATE
データ型またはTIMESTAMPデータ型をANSI
DATE
に割り当てると、時間部分は無視されます。
ANSI DATE
データ型を使用するかわりに、日付と時間の両方を含むTIMESTAMP
データ型の使用をお薦めします。
TIMESTAMP
データ型は、DATE
データ型の拡張機能です。DATE
データ型の年、月および日に加えて、時、分および秒の値を格納します。タイム・ゾーンはありません。TIMESTAMP
データ型の形式は次のとおりです。
TIMESTAMP(fractional_seconds_precision)
この書式では、オプションのfractional_seconds_precision
で、SECOND
日時フィールドの小数部分の桁数を指定し、桁数は0から9を指定できます。デフォルトは6です。
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
オフセットに関係なく同一とみなされます。
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です。
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 (day_precision) TO SECOND(fractional_seconds_precision)
この書式の要素:
day_precision
は、DAY
日時フィールドの桁数です。これはオプションです。指定できる値は0から9です。デフォルト値は2です。
fractional_seconds_precision
は、SECOND
日時フィールドの小数部の桁数です。指定できる値は0から9です。デフォルトは6です。
システム固有のfloat (SQLT_BFLOAT
)およびシステム固有のdouble(SQLT_BDOUBLE
)データ型は、単精度浮動小数点値および倍精度浮動小数点値を表現します。これらは、システムに固有の書式、つまりホスト・システムの浮動小数点書式で表されます。
これらの外部型は、BINARY_FLOAT
およびBINARY_DOUBLE
内部データ型を外部で表すために、リリース10.1で追加されました。したがって、内部型は、外部型のシステム固有のfloatおよびdoubleとともにそれぞれ使用したときに、最適なパフォーマンスが得られます。これにより、浮動小数点値の既存の表現(SQLT_FLT
)とこれらの型は、明確に区別されます。
表3-5は、リリース7.3で使用可能な全データ型についてサポートされている、内部データ型から外部データ型、および外部データ型から内部列表現への変換を示しています。リリース7.3より後に追加された新しいデータ型のデータ変換の詳細は、次のとおりです。
データベースに格納されているREFは、出力時にSQLT_REF
に変換されます。
SQLT_REF
は、入力時にREF
の内部表現に変換されます。
データベースに格納されている名前付きデータ型は、出力時にSQLT_NTY
に変換されます(アプリケーション内ではC構造体で表現されます)。
SQLT_NTY
(アプリケーション内ではC構造体で表現されます)は、入力時に、対応する型の内部表現に変換されます。
表の幅が限られているため、LOBについては表3-6にリストされています。
表3-5 データ変換
NA脚注 1 | 内部データ型-> | NA | NA | NA | NA | NA | NA | NA | NA |
---|---|---|---|---|---|---|---|---|---|
外部データ型 | VARCHAR2 | NUMBER | LONG | ROWID | UROWID | DATE | RAW | LONG RAW | CHAR |
|
I/O脚注 2 |
I/O |
I/O |
I/O脚注 3 |
I/O脚注 3 |
I/O脚注 4 |
I/O脚注 5 |
I/O脚注 5 |
NA |
|
I/O脚注 6 |
I/O |
I脚注 7 |
NA |
NA |
NA |
NA |
NA |
I/O脚注 6 |
|
I/O脚注 6 |
I/O |
I |
NA |
NA |
NA |
NA |
NA |
I/O脚注 6 |
|
I/O脚注 6 |
I/O |
I |
NA |
NA |
NA |
NA |
NA |
I/O脚注 6 |
|
I/O |
I/O |
I/O |
I/O脚注 3 |
I/O脚注 3 |
I/O脚注 4 |
I/O脚注 5 |
I/O |
|
|
I/O脚注 6 |
I/O |
I |
NA |
NA |
NA |
NA |
NA |
I/O脚注 6 |
|
I/O脚注 6 |
I/O |
I |
NA |
NA |
NA |
NA |
NA |
I/O脚注 6 |
|
I/O |
I/O |
I/O |
I/O脚注 3 |
I/O脚注 3 |
I/O脚注 4 |
I/O脚注 5 |
I/O |
|
|
I/O |
I/O |
I/O |
I/O脚注 3 |
I/O脚注 3 |
I/O脚注 4 |
I/O脚注 5 |
I/O |
|
|
I/O |
NA |
I |
NA |
NA |
I/O |
NA |
NA |
I/O |
|
I/O脚注 9 |
NA |
NA |
NA |
NA |
I/O |
I/O |
I/O脚注 9 |
|
|
I/O脚注 9 |
NA |
NA |
NA |
NA |
I/O |
I/O |
I/O脚注 9 |
|
|
NA |
NA |
NA |
NA |
I/O |
I/O |
O脚注 9 |
||
|
I/O脚注 6 |
I/O |
I |
NA |
NA |
NA |
NA |
NA |
I/O脚注 6 |
|
I/O |
I/O |
I/O |
I/O脚注 3 |
I/O脚注 3 |
I/O脚注 4 |
I/O脚注 5 |
I/O |
|
|
I/O脚注 9 |
NA |
NA |
NA |
NA |
I/O |
I/O |
I/O脚注 9 |
|
|
I/O |
I/O |
I/O |
I/O脚注 3 |
I/O脚注 3 |
I/O脚注 4 |
I/O脚注 5 |
I脚注 5 |
I/O |
|
I/O |
I/O |
I/O |
I/O脚注 3 |
I/O脚注 3 |
I/O脚注 4 |
I/O脚注 5 |
I脚注 5 |
I/O |
|
I脚注 3 |
NA |
NA |
I/O |
I/O |
NA |
NA |
NA |
I脚注 3 |
脚注 1 NAは、該当なしを意味します。
脚注 2 I/O = 入力時または出力時に有効な変換。
脚注 3 入力時、ホスト文字列はOracle ROWID/UROWID形式であることが必要です。出力時、列値はOracle ROWID/UROWID形式で戻されます。
脚注 4 入力時、ホスト文字列はOracle DATE文字形式であることが必要です。出力時、列値はOracle DATE形式で戻されます。
脚注 5 入力時、ホスト文字列は16進フォーマットであることが必要です。出力時、列値は16進フォーマットで戻されます。
脚注 6 出力時、列値が有効な数値を表している必要があります。
脚注 7 I = 入力時のみ有効な変換。
脚注 8 長さは2000以下であることが必要です。
脚注 9 入力時、列値は16進フォーマットで格納されます。出力時、列値は16進フォーマットであることが必要です。
脚注 10 O = 出力時のみ有効な変換。
表3-6では、LOB
のデータ変換を示しています。たとえば、外部文字データ型(VARCHAR
、CHAR
、LONG
およびLONG VARCHAR
)は、内部CLOB
データ型に変換されるのに対して、外部RAWデータ型(RAW
、VARRAW
、LONG RAW
およびLONG VARRAW
)は、内部BLOB
データ型に変換されます。
表3-6 LOBのデータ変換
外部データ型 | 内部CLOB | 内部BLOB |
---|---|---|
|
I/O脚注 1 |
NA脚注 2 |
|
I/O |
NA |
|
I/O |
NA |
|
I/O |
NA |
|
NA |
I/O |
|
NA |
I/O |
|
NA |
I/O |
|
NA |
I/O |
脚注 1 I/O = 入力時または出力時に有効な変換。
脚注 2 NAは、該当なしを意味します。
文字データ型のいずれかを、日時列または時間隔列のフェッチ操作または挿入操作で使用するホスト変数に対して使用することもできます。Oracle Databaseでは、文字データ型と日時データ型または時間隔データ型との間の変換が行われます(表3-7を参照)。
表3-7 日時および時間隔データ型のデータ変換
外部データ型/内部データ型 | VARCHAR、CHAR | DATE | TS | TSTZ | TSLTZ | INTERVALYEARTOMONTH | INTERVALDAYTOSECOND |
---|---|---|---|---|---|---|---|
|
I/O脚注 1 |
I/O |
I/O |
I/O |
I/O |
I/O |
I/O |
|
I/O |
I/O |
I/O |
I/O |
I/O |
NA脚注 2 |
NA |
|
I/O |
I/O |
I/O |
I/O |
I/O |
NA |
NA |
|
I/O |
I/O |
I/O |
I/O |
I/O |
NA |
NA |
|
I/O |
I/O |
I/O |
I/O |
I/O |
NA |
NA |
|
I/O |
I/O |
I/O |
I/O |
I/O |
NA |
NA |
|
I/O |
I/O |
I/O |
I/O |
I/O |
NA |
NA |
|
I/O |
NA |
NA |
NA |
NA |
I/O |
NA |
|
I/O |
NA |
NA |
NA |
NA |
NA |
I/O |
脚注 1 I/O = 入力時または出力時に有効な変換。
脚注 2 NAは、該当なしを意味します。
タイム・ゾーンがあるソースを、タイム・ゾーンのないターゲットに割り当てると、ソースのタイム・ゾーン部分は無視されます。タイム・ゾーンのないソースを、タイム・ゾーンがあるターゲットに割り当てると、ターゲットのタイム・ゾーンには、セッションのデフォルト・タイム・ゾーンが設定されます。
Oracle Database DATE
をTIMESTAMP
に割り当てると、DATE
のTIME
部分がTIMESTAMP
にコピーされます。TIMESTAMP
をOracle Database DATE
に割り当てると、割当て後のDATE
のTIME
部分には0 (ゼロ)が設定されます。これは、Oracle Database DATE
からANSI
準拠のDATETIME
データ型へのアップグレードを容易にするために行われます。
ANSI
DATE
をOracle DATE
またはTIMESTAMP
に割り当てると、Oracle Database DATE
のTIME
部分とTIMESTAMP
には0 (ゼロ)が設定されます。Oracle Database DATE
またはTIMESTAMP
をANSI DATE
に割り当てると、TIME
部分は無視されます。
DATETIME
を文字列に割り当てると、DATETIME
は、セッションのデフォルトのDATETIME
形式によって変換されます。文字列をDATETIME
に割り当てる場合は、その文字列にセッションのデフォルトのDATETIME
形式に基づく有効なDATETIME
値が含まれていることが必要です。
文字列をINTERVAL
に割り当てる場合、その文字列が有効なINTERVAL
文字形式であることが必要です。
OCIでは、日時列および日付列について、クライアント・アプリケーションとOracle Database間の完全な上位互換性および下位互換性を備えています。
9.0より前のアプリケーションで使用できる日時データ型は、DATE
データ型のSQLT_DAT
のみです。バッファをSQLT_DAT
に定義した9.0より前のクライアントでTSLTZ
列からデータを取得しようとすると、値の日付部分のみがクライアントに戻されます。
9.0より前のサーバーを9.0以上のクライアントとともに使用する場合、クライアントにSQLT_TIMESTAMP_LTZ
型のバインド・バッファまたは定義バッファがある場合があります。この場合は、次の互換性が維持されます。
クライアント・アプリケーションで、SQLT_TIMESTAMP_LTZ
(または新しい日時データ型)をDATE
列に挿入しようとすると、データが失われる可能性があるため、エラーが発生します。
クライアントにSQLT_TIMESTAMP_LTZ
データ型のOUTバインド・バッファまたは定義バッファがあり、サーバー側の基礎となるSQLバッファまたは列がDATE
型の場合は、セッションのタイム・ゾーンが割り当てられます。
表3-8に、内部数値データ型と関連するすべての外部型の間でサポートされている変換を示します。(I)は変換が入力のみ(バインド)に有効であることを示し、(O)は変換が出力のみ(定義)に有効であることを示します。(I/O)は変換が入力と出力(バインドおよび定義)の両方に有効であることを示します。
表3-8 外部データ型から内部数値データ型へのデータ変換
外部データ型/内部データ型 | BINARY_FLOAT | BINARY_DOUBLE |
---|---|---|
|
I/O脚注 1 |
I/O |
|
I/O |
I/O |
|
I/O |
I/O |
|
I/O |
I/O |
|
I/O |
I/O |
|
I/O |
I/O |
|
I/O |
I/O |
|
I/O |
I/O |
|
I/O |
I/O |
|
I/O |
I/O |
|
I/O |
I/O |
|
I/O |
I/O |
|
I/O |
I/O |
脚注 1 (I/O)は変換が入力と出力(バインドおよび定義)に有効であることを示します。
表3-9に、関連するすべての内部型と外部数値データ型の間でサポートされている変換を示します。(I)は変換が入力のみ(バインドの場合のみ)に有効であることを示し、(O)は変換が出力のみ(定義の場合のみ)に有効であることを示します。(I/O)は変換が入力と出力(バインドおよび定義)の両方に有効であることを示します。
表3-9 内部データ型から外部数値データ型へのデータ変換
内部データ型/外部データ型 | システム固有のfloat | システム固有のdouble |
---|---|---|
|
I/O脚注 1 |
I/O |
|
I/O |
I/O |
|
I脚注 2 |
I |
|
I/O |
I/O |
|
I/O |
I/O |
|
I/O |
I/O |
脚注 1 (I/O)は変換が入力と出力(バインドおよび定義)に有効であることを示します。
脚注 2 (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つの属性のデータ型間の違いが保持されています。つまり、attr1
はOCI_TYPECODE_NUMBER
、attr2
はOCI_TYPECODE_INTEGER
およびattr3
はOCI_TYPECODE_SMALLINT
です。アプリケーションでmy_type
を記述すると、これらの型コードが返されます。
OCITypeCode
は、型コードのCデータ型です。型コードは、OCIObjectNew()などの一部のOCI関数で使用され、作成するオブジェクトの型を決定するのに役に立ちます。また、オブジェクトを記述した際に一部の属性の値としても返されます。たとえば、型のOCI_ATTR_TYPECODE
属性を問い合せるとOCITypeCode
値を返します。
表3-10は、OCITypeCode
に可能な値を示しています。各Oracleデータ型に対応する値があります。
表3-10 OCITypeCodeの値とデータ型
値 | データ型 |
---|---|
|
REF |
|
DATE |
|
TIMESTAMP |
|
TIMESTAMPWITHTIMEZONE |
|
TIMESTAMPWITHLOCALTIMEZONE |
|
INTERVALYEARTOMONTH |
|
INTERVALDAYTOSECOND |
|
単精度実数 |
|
倍精度実数 |
|
浮動小数点 |
|
Oracle NUMBER |
|
BINARY_FLOAT |
|
BINARY_DOUBLE |
|
10進数 |
|
8進数 |
|
INTEGER |
|
SMALL INT |
|
RAW |
|
ANSI SQLの可変文字列、すなわちVARCHAR2 |
|
Oracle SQLの可変文字列、すなわちVARCHAR |
|
SQL内部の固定長文字列、すなわちSQL CHAR |
|
可変長配列(VARRAY) |
|
多重集合 |
|
キャラクタ・ラージ・オブジェクト(CLOB) |
|
バイナリ・ラージ・オブジェクト(BLOB) |
|
バイナリ・ラージ・オブジェクト・ファイル( |
|
名前付きオブジェクト型、またはSYS.XMLType |
|
ドメイン(名前付き基本型) |
2種類のデータ型コード値のセットを認識します。これらのセットの1つはSQLT_
接頭辞、もう1つはOCI_TYPECODE_
接頭辞によって区別されます。
SQLT
型コードは、バインド操作または定義操作でデータ型を指定するためにOCIで使用され、これにより、Oracle DatabaseとOCIクライアント・アプリケーション間のデータ変換を制御できます。OCI_TYPECODE
型は、ユーザー定義型を操作または作成する際に、Oracleの型システムで事前定義済の型を参照または記述するために使用します。
多くの場合、SQLT
値とOCI_TYPECODE
値の間で、ダイレクト・マッピングがあります。ただし、1対1のダイレクト・マッピングがない場合もあります。たとえば、OCI_TYPECODE_SIGNED8
、OCI_TYPECODE_SIGNED16
、OCI_TYPECODE_SIGNED32
、OCI_TYPECODE_INTEGER
、OCI_TYPECODE_OCTET
およびOCI_TYPECODE_SMALLINT
はすべて、SQLT_INT
型にマップされます。
表3-11では、SQLT
型とOCI_TYPECODE
型の間のマッピングを示します。
表3-11 OCI_TYPECODEからSQLTへのマップ
Oracle型システムの型名 | Oracle型システムの型 | 等価SQLT型 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<なし> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<なし> |
|
|
|
|
|
|
|
|
|
|
|
<なし> |
|
|
|
|
|
|
脚注 1 nはバイト単位の文字列です。
脚注 2 これらは浮動小数点で、精度は2進数での桁数です。 bは、2進数数値の精度です。
脚注 3 これは小数点以下の数値を伴わないNUMBERと等価です。
脚注 4 iはバイト単位の数値で、OCIコールの一部として設定されます。
脚注 5 pは10進数での数値の精度で、sは10進数で数値のスケールです。
脚注 6 名前付きコレクション型の一部としてのみ可能です。