この章は、OCIアプリケーションで使用するOracle外部データ型についてのリファレンスです。この章では、Oracleデータ型、および独自に作成したプログラムとOracleの間でデータを転送する場合に行われる、データの内部表現と外部表現の変換についても説明します。
この章は、次の項目で構成されています。
OCIプログラムの重要な機能の1つは、Oracleサーバーを介してデータベースと通信を行うことです。OCIアプリケーションでは、SQL SELECTを使用した問合せによってデータベースの表からデータを取り出すか、INSERT、UPDATEまたはDELETE文を使用して表内の既存データを変更します。
データベース内では、値は表の列に格納されています。内部的には、Oracleは内部データ型という特別な形式でデータを表現します。内部データ型の例として、NUMBER、CHAR、DATEなどがあります。
一般的に、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データベースの表の列で使用されます。これは、PL/SQLで使用され、Oracle列では使用されないデータ型も含まれます(たとえば、索引付き表、ブール、レコード)。
外部OCIデータ型。Oracleデータのホスト言語表現を指定するために使用されます。
OCI_TYPECODE値。Oracleでオブジェクト型属性の型情報を表現するために使用されます。
列の内部データ型についての情報は、内部データ型コードの形式でアプリケーションに送られます。アプリケーション側では、どの型のデータが戻されるのかがわかると、出力データの変換方法と書式設定の方法について適切な判断ができます。Oracle内部データ型コードのリストは、「内部データ型」を参照してください。
外部データ型コードによって、プログラムでのホスト変数のデータ表現方法が指定されます。これによって、プログラムの出力変数にデータが戻されるときの変換方法、または入力(バインド)変数からOracleの列値へのデータ変換方法が決まります。たとえば、Oracle列のNUMBERを可変長文字配列に変換する場合は、出力変数を定義するOCIDefineByPos()コールでVARCHAR2外部データ型コードを指定します。
バインド変数をOracle列の値に変換するには、バインド変数の型に対応する外部データ型コードを指定します。たとえば、02-FEB-65などの文字列をDATE列に入力する場合は、データ型を文字列として指定し、文字列長パラメータを9に設定します。
使用する値を変換可能にするのは、常にプログラマの責任です。文字列"MY BIRTHDAY"をDATE列に挿入する文を実行すると、エラーが発生します。
表3-1は、Oracle内部(組込み)データ型を各型の最大内部長およびデータ型コードとともに示しています。
OCIBindByName()、OCIBindByPos()、OCIDefineByPos()、OCIStmtGetPieceInfo()およびOCIStmtSetPieceInfo()によって提供されるピース単位機能を使用すると、これらの型の列データの挿入、更新またはフェッチを実行できます。
文字またはバイト配列を含む列を指定する場合は、CHAR、VARCHAR2、RAW、LONGおよびLONG RAWの5つのOracle内部データ型を使用できます。
|
注意: LOBには文字を、 BFILEにはバイナリ・データを含めることができます。これらは、他の型とは異なる処理がされるので、ここでは説明しません。これらのデータ型の詳細は、第7章「LOBおよびBFILEの操作」を参照してください。 |
通常、CHAR列、VARCHAR2列およびLONG列には文字データが入ります。RAWおよびLONG RAWには、文字として解釈されないバイト、たとえばビットマップ化された画像のピクセル値などが入ります。ネットワーク間のゲートウェイを介して文字データを渡すと、文字データが変形する可能性があります。1文字を表現するバイト数が異なる別々の言語を使用しているマシン間で文字データを渡すと、長さが大きく変わる可能性があります。RAWデータがこのように変換されることはありません。
表の列ごとに適切なOracle内部データ型を選択するのは、データベースの設計者の責任です。OCIプログラマは、文字データおよびバイト配列データの表現方法、およびOCIプログラムの変数とOracle表の間でのデータの変換方法を多数知っておく必要があります。
配列に文字が入っている場合、OCIコール内の配列の長さを示すパラメータは、常に文字単位ではなくバイト単位で渡され、バイト単位で戻されます。
ユニバーサルROWID(UROWID)は、Oracle表の論理ROWIDおよび物理ROWIDを格納するデータ型です。論理ROWIDは、索引構成表(IOT)の行に対する主キー・ベースの論理識別子です。
UROWIDデータ型の列を使用するには、COMPATIBLE初期化パラメータの値をリリース8.1以上に設定する必要があります。
次のホスト変数を、ユニバーサルROWIDにバインドできます。
SQLT_CHR(VARCHAR2)
SQLT_VCS(VARCHAR)
SQLT_STR(NULL文字で終了する文字列)
SQLT_LVC(LONG VARCHAR)
SLQT_AFC(CHAR)
SQLT_AVC(CHARZ)
SQLT_VST(OCI文字列)
SQLT_RDD(ROWID記述子)
BINARY_FLOATデータ型およびBINARY_DOUBLEデータ型は、単精度浮動小数点値および倍精度浮動小数点値を表現し、主に、浮動小数点演算のIEEE754標準に準拠しています。
これらのデータ型が追加される前は、Oracleデータベース内の数値はすべて、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(OCI文字列)
最適なパフォーマンスを得るために、BINARY_FLOATデータ型およびBINARY_DOUBLEデータ型とともに、外部型SQLT_BFLOATとSQLT_BDOUBLEを使用することをお薦めします。
表3-2は、外部データ型のデータ型コードを示しています。この表ではデータ型ごとに、Oracle内部データの変換元または変換先となる、Cのプログラム変数の型を示しています。
表3-2 外部データ型とそのコード
| 外部データ型 | CODE | プログラム変数 | OCI定義の定数 |
|---|---|---|---|
|
|
1 |
char[n] |
|
|
|
2 |
unsigned char[21] |
|
|
8ビット符号付き |
3 |
signed char |
|
|
16ビット符号付き |
3 |
signed short、signed int |
|
|
32ビット符号付き |
3 |
signed int、signed 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 * |
|
|
注意: データ長がnとなっている場合、nは可変でプログラム( ROWIDの場合はオペレーティング・システム)の要件に依存します。
|
次の3つの型はPL/SQLに対する内部型で、OCIでは値として戻すことができません。
ブール、SQLT_BOL
索引付き表、SQLT_TAB
レコード、SQLT_REC
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を使用すると、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は符号付きの2進数です。バイト単位のサイズはシステムによって異なります。変数内のバイトの順序は、ホスト・システム・アーキテクチャによって決まります。長さ指定は、入力でも出力でも必須です。Oracleから戻される数値が整数でない場合、小数部分は廃棄され、エラーやその他の情報は戻されません。戻される数値がシステムの符号付きINTEGERで表現できない場合は、「変換時にオーバーフローが発生しました(overflow on conversion)」エラーが戻されます。
FLOATデータ型は、小数部分のある数値、またはINTEGERでは表現できない数値を処理します。数値はホスト・システムの浮動小数点書式で表されます。通常、長さは4バイトか8バイトのいずれかです。長さ指定は、入力および出力の両方について必要です。
Oracleの数値の内部形式は10進数で、大部分の浮動小数点は2進数です。したがって、数値を浮動小数点で表現するよりもより高い精度で表現できます。
|
注意: FLOATおよびNUMBER間の変換時には丸め処理のエラーが発生する場合もあります。問合せでバインド変数としてFLOATを使用すると、ORA-01403エラーが戻されることがあります。この状況を回避するには、FLOATをSTRINGに変換し、VARCHAR2またはNULL終了文字列を設定します。 |
ヌル文字で終了するSTRING形式は、文字列にヌル終端文字が必要であることを除けば、VARCHAR2形式と同じように動作します。このデータ型は、特にC言語のプログラムで有用です。
OCIBindByName()またはOCIBindByPos()コールで供給される文字列の長さによって、ヌル終端文字があるかどうかのスキャンの範囲が制限されます。ヌル終端文字が指定された中で見つからなかった場合は、エラーとなります。
ORA-01480: STRバインド値に終了のNULLがありません。
バインド・コールで長さが指定されていない場合、OCIは、文字列の暗黙の最大長の4000を使用します。
文字列の最小の長さは2バイトです。最初の文字がヌル終端文字であり、長さが2と指定されている場合、許可されていればNULLが列に挿入されます。VARCHAR2型およびCHAR型とは異なり、空白のみを含む文字列は入力時にNULLとして扱われるのではなく、そのまま挿入されます。
|
注意: OCIのこれまでのバージョンとは異なり、リリース8.0以上のOCIでは、 ヌル文字で終了する文字列の文字列長パラメータに-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年の表記は、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データ型は、たとえば図形文字列の格納など、Oracleで解釈されないバイナリ・データまたはバイト列で使用されます。RAW列の最大長は2000バイトです。
Oracle表内のRAWデータ(ロー・データ)がプログラムで文字列に変換される場合、データは16進文字コードで表されます。RAWデータの各バイトは、それぞれの値を示す'00'〜'FF'の2文字で戻されます。プログラムの文字列をOracle表内のRAW列に入力する場合は、この16進コードを使用して文字列のデータをコード化する必要があります。
OCIDefineByPos()、OCIBindByName()、OCIBindByPos()、OCIStmtGetPieceInfo()およびOCIStmtSetPieceInfo()によって提供されるピース単位機能を使用すると、RAW列(またはLONG RAW列)を扱う挿入、更新またはフェッチを実行できます。
|
関連項目: Oracleデータベースでオブジェクトを使用する場合は、一連の事前定義済OCI関数を使用して、特殊な OCIRawデータ型を扱うことができます。このデータ型の詳細は、第12章「OCIのオブジェクト・リレーショナル・データ型」を参照してください。 |
VARRAWデータ型は、RAWデータ型に類似しています。ただし、先頭の2バイトにはデータの長さが記述されます。バインド・コールまたは定義コールで指定する文字列の長さには、この2バイトを含める必要があるため、送受信可能なVARRAW文字列の最大長は、65535バイトではなく、65533バイトになります。これより長い文字列を変換する場合は、LONG VARRAW外部データ型を使用します。
UNSIGNEDデータ型は、符号なし2進整数に対して使用されます。バイト単位のサイズは、システムによって異なります。ワード内のバイトの順序は、ホスト・システムのアーキテクチャによって決まります。長さ指定は、入力でも出力でも必須です。Oracleから出力される数値が整数でない場合は、小数部分が廃棄され、エラーやその他の情報は戻されません。戻される数値がシステムの符号なし整数より大きくて表現できない場合、「変換時にオーバーフローが発生しました(overflow on conversion)」というエラーが戻されます。
LONG VARCHARデータ型は、OracleのLONG列からデータを格納する場合、またはこの列にデータを格納する場合に使用します。LONG VARCHARの先頭の4バイトには項目の長さが記述されます。したがって、格納される項目の最大長は、2^31-5バイトです。
LONG VARRAWデータ型は、Oracle LONG RAW列からデータを格納する場合、またはこの列にデータを格納する場合に使用します。長さは、先頭の4バイトに記述されます。最大長は、2^31-5バイトです。
CHARデータ型は最長2000の文字列です。CHAR文字列は空白埋め比較セマンティクスで比較されます。
長さは、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外部データ型は、入力時に文字列がヌル文字で終了していること、および出力時にOracleによって文字列の最後にヌル終端文字が配置されることを除けば、CHARデータ型と同じです。ヌル終端文字は入出力時に文字列を区切るためのもので、表のデータの一部ではありません。
入力時に、長さのパラメータは、ヌル終端文字も含めた正確な長さを示す必要があります。たとえば、Cの配列が次のように宣言されたとします。
char my_num[] = "123.45";
この場合、my_numのバインド時の長さのパラメータは7になっている必要があります。この例で他の値を指定すると、エラーが戻されます。
次の新しい外部データ型は、リリース8.0から導入されました。これらのデータ型は、Oracle7 Serverへ接続した場合にはサポートされません。
|
注意: 内部データ型および外部データ型は、いずれもそれぞれのデータ型コードに対応するOracle定義の定数値( SQLT_NTY、SQLT_REFなど)を含んでいます。この章に出てくるすべての型についての定数はリストしていませんが、この項では新しいOracleデータ型を説明する際に、それらの定数を使用します。また、データ型定数は、これらの新しい型を参照するときに、このマニュアルの他の章でも使用されます。 |
名前付きデータ型は、SQLのCREATE TYPEコマンドで指定するユーザー定義の型です。例として、オブジェクト型、VARRAY、NESTED TABLEなどがあります。OCIでは、名前付きデータ型は型のホスト言語による表現を意味します。SQLT_NTYデータ型コードは、名前付きデータ型をバインドまたは定義する際に使用します。
Cアプリケーションでは、名前付きデータ型はC構造体として表されます。このような構造体は、データベース内に格納された型からObject Type Translator(OTT)を使用して生成されます。これらの型は、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は、データベース・サーバーのトランザクションを完全にサポートしています。データベースの表には、別の記憶領域にある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では、バイナリ・ファイル、つまりBFILEへのアクセスがサポートされます。BFILEデータ型を使用すると、Oracleデータベース以外のファイル・システムに格納されているファイルLOBへのアクセスが可能になります。
BFILEの列または属性には、サーバーのファイル・システムにあるバイナリ・ファイルへのポインタとして機能するファイルLOBロケータが格納されます。このロケータにより、ディレクトリのオブジェクトとファイル名が維持されます。BFILEの最大サイズは、使用しているオペレーティング・システムの最大ファイル・サイズまたはUB8MAXVALのいずれか小さい方になります。
バイナリ・ファイルLOBは、トランザクションでは使用されません。ファイルの完全性および永続性は、ベースとなるオペレーティング・システムにより提供されます。
データベース管理者は、ファイルが存在していること、およびOracleプロセスがそのファイルに対してオペレーティング・システムの読取り権限を持っていることを確認する必要があります。
BFILEデータ型では、大きなバイナリ・ファイルの読取り専用サポートが可能です。Oracleからファイルを変更することはできません。ファイル・データにアクセスするためのAPIを提供しています。
BFILEをバインドまたは定義するために使用できるデータ型コードは、次のとおりです。
SQLT_BFILE: バイナリFILE LOBデータ型
BLOBデータ型には、非構造化バイナリ・ラージ・オブジェクトが格納されます。BLOBは、キャラクタ・セットのセマンティクスを持たないビット・ストリームと考えられます。BLOBには、最大128TBのバイナリ・データを格納できます。
BLOBは完全なトランザクション・サポートを備えています。OCIを通じて行った変更は、完全にトランザクションで使用できます。BLOB値に対して行った操作は、コミットまたはロールバックできます。1つのトランザクション内で変数のBLOBロケータを保存し、次にそれを別のトランザクションまたはセッションで使用することはできません。
CLOBデータ型には固定幅または可変幅の文字データが格納されます。CLOBには、最大128TBの文字データを格納できます。
CLOBは完全なトランザクション・サポートを備えています。OCIを通じて行った変更は、完全にトランザクションで使用できます。CLOB値に対して行った操作は、コミットまたはロールバックできます。1つのトランザクション内で変数のCLOBロケータを保存し、次にそれを別のトランザクションまたはセッションで使用することはできません。
NCLOBは、CLOBの各国語キャラクタ・バージョンです。NCLOBは、固定幅、シングルバイト、マルチバイトの各国語キャラクタ・セット(NCHAR)、または可変幅のキャラクタ・セットのデータを格納します。NCLOBには、最大128TBの文字データを格納できます。
NCLOBは完全なトランザクション・サポートを備えています。OCIを通じて行った変更は、完全にトランザクションで使用できます。NCLOB値に対して行った操作は、コミットまたはロールバックできます。1つのトランザクション内で変数のNCLOBロケータを保存し、次にそれを別のトランザクションまたはセッションで使用することはできません。
ここでは、日時および時間隔のデータ型記述子について簡単に説明します。
ANSI DATEデータ型はDATEデータ型が基本になっていますが、時間部分は含まれていません。タイム・ゾーンもありません。ANSI DATEは、DATEデータ型のANSI仕様に従います。ANSI DATEをDATEデータ型またはTIMESTAMPデータ型に割り当てると、OracleのDATEやTIMESTAMPの時間部分は0(ゼロ)に設定されます。DATEデータ型またはTIMESTAMPデータ型をANSI DATEに割り当てると、時間部分は無視されます。
かわりに、日付と時間の両方を含むTIMESTAMPデータ型の使用をお薦めします。
TIMESTAMPは、DATEデータ型を拡張したデータ型です。このデータ型には、DATEデータ型の年、月、日に加えて、時間、分および秒の各値が格納されます。タイム・ゾーンはありません。TIMESTAMPデータ型の書式は次のとおりです。
TIMESTAMP(fractional_seconds_precision)
fractional_seconds_precision日時フィールドの小数部分の桁数を指定します。桁数は0〜9を指定でき、デフォルト値は6です。では、SECOND
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内部データ型を外部で表現するために追加されました。したがって、新しい内部型は、外部型のシステム固有の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 データ変換
| - | 内部データ型-> | - | - | - | - | - | - | - | - |
|---|---|---|---|---|---|---|---|---|---|
| 外部データ型 | VARCHAR2 | NUMBER | LONG | ROWID | UROWID | DATE | RAW | LONG RAW | CHAR |
|
|
I/O |
I/O |
I/O |
I/O(1) |
I/O(1) |
I/O(2) |
I/O(3) |
I/O(3) |
- |
|
|
I/O(4) |
I/O |
I |
- |
- |
- |
- |
- |
I/O(4) |
|
|
I/O(4) |
I/O |
I |
- |
- |
- |
- |
- |
I/O(4) |
|
|
I/O(4) |
I/O |
I |
- |
- |
- |
- |
- |
I/O(4) |
|
|
I/O |
I/O |
I/O |
I/O(1) |
I/O(1) |
I/O(2) |
I/O(3) |
I/O(3、5) |
I/O |
|
|
I/O(4) |
I/O |
I |
- |
- |
- |
- |
- |
I/O(4) |
|
|
I/O(4) |
I/O |
I |
- |
- |
- |
- |
- |
I/O(4) |
|
|
I/O |
I/O |
I/O |
I/O(1) |
I/O(1) |
I/O(2) |
I/O(3) |
I/O(3、5) |
I/O |
|
|
I/O |
I/O |
I/O |
I/O(1) |
I/O(1) |
I/O(2) |
I/O(3) |
I/O(3、5) |
I/O |
|
|
I/O |
- |
I |
- |
- |
I/O |
- |
- |
I/O |
|
|
I/O(6) |
- |
I(5、6) |
- |
- |
- |
I/O |
I/O |
I/O(6) |
|
|
I/O(6) |
- |
I(5、6) |
- |
- |
- |
I/O |
I/O |
I/O(6) |
|
|
O(6) |
- |
I(5、6) |
- |
- |
- |
I/O |
I/O |
O(6) |
|
|
I/O(4) |
I/O |
I |
- |
- |
- |
- |
- |
I/O(4) |
|
|
I/O |
I/O |
I/O |
I/O(1) |
I/O(1) |
I/O(2) |
I/O(3) |
I/O(3、5) |
I/O |
|
|
I/O(6) |
- |
I(5、6) |
- |
- |
- |
I/O |
I/O |
I/O(6) |
|
|
I/O |
I/O |
I/O |
I/O(1) |
I/O(1) |
I/O(2) |
I/O(3) |
I(3) |
I/O |
|
|
I/O |
I/O |
I/O |
I/O(1) |
I/O(1) |
I/O(2) |
I/O(3) |
I(3) |
I/O |
|
|
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進フォーマットであることが必要です。
文字データ型のいずれかを、日時列または時間隔列のフェッチ操作または挿入操作で使用するホスト変数に対して使用することもできます。文字データ型と日時/時間隔データ型との間の変換が行われます。
表3-7「日時および時間隔データ型のデータ変換」を次に示します。
表3-7 日時および時間隔データ型のデータ変換
| 外部データ型/内部データ型 | VARCHAR、CHAR | DATE | TS | TSTZ | TSLTZ | INTERVAL YEAR TO MONTH | INTERVAL DAY TO SECOND |
|---|---|---|---|---|---|---|---|
|
|
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 |
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 |
タイム・ゾーンがあるソースを、タイム・ゾーンのないターゲットに割り当てると、ソースのタイム・ゾーン部分は無視されます。タイム・ゾーンのないソースを、タイム・ゾーンがあるターゲットに割り当てると、ターゲットのタイム・ゾーンには、セッションのデフォルト・タイム・ゾーンが設定されます。
Oracle DATEをTIMESTAMPに割り当てると、DATEのTIME部分がTIMESTAMPにコピーされます。TIMESTAMPをOracle DATEに割り当てると、割当て後のDATEのTIME部分には0(ゼロ)が設定されます。この0(ゼロ)設定は、Oracle DATEからANSI準拠のDATETIMEデータ型へのアップグレードを容易にするために行われます。
ANSI DATEをOracle DATEまたはTIMESTAMPに割り当てると、Oracle DATEのTIME部分とTIMESTAMPには0(ゼロ)が設定されます。Oracle DATEまたはTIMESTAMPをANSI DATEに割り当てると、TIME部分は無視されます。
DATETIMEを文字列に割り当てると、DATETIMEは、セッションのデフォルトのDATETIME形式によって変換されます。文字列をDATETIMEに割り当てる場合は、その文字列にセッションのデフォルトのDATETIME形式に基づく有効なDATETIME値が含まれていることが必要です。
文字列をINTERVALに割り当てる場合、その文字列が有効なINTERVAL文字形式であることが必要です。
(1) TSLTZからCHAR、DATE、TIMESTAMPおよびTSTZに変換すると、値はセッションのタイム・ゾーンに合わせて調整されます。
(2) CHAR、DATEおよびTIMESTAMPをTSLTZに変換すると、セッションのタイム・ゾーンはメモリー内に格納されます。
(3) TSLTZをANSI DATEに変換すると、TIME部分には0(ゼロ)が設定されます。
(4) TSTZを変換すると、タイム・スタンプを含むタイム・ゾーンはメモリー内に格納されます。
(5) 文字列をINTERVALに割り当てる場合、文字列は有効なINTERVAL文字形式であることが必要です。
OCIでは、日時列および日付列について、クライアント・アプリケーションとデータベース・サーバー間の完全な上位互換性および下位互換性を備えています。
リリース1(9.0.1)より前のアプリケーションで使用できる日時データ型は、DATEデータ型のSQLT_DATのみです。バッファをSQLT_DATに定義したリリース1(9.0.1)より前のクライアントでTSLTZ列からデータを取得しようとすると、値の日付部分のみがクライアントに戻されます。
このケースでは、新しいクライアントに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 |
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 |
表3-9に、関連するすべての内部型と外部数値データ型の間でサポートされている変換を示します。(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型となります。これは、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 |
|
|
TIMESTAMP WITH TIME ZONE |
|
|
TIMESTAMP WITH LOCAL TIME ZONE |
|
|
INTERVAL YEAR TO MONTH |
|
|
INTERVAL DAY TO SECOND |
|
|
単精度実数 |
|
|
倍精度実数 |
|
|
浮動小数点 |
|
|
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とOCIクライアント・アプリケーション間のデータ変換を制御できます。OCI_TYPECODE型は、ユーザー定義型を操作または作成する際に、Oracleの型システムで事前定義済の型を参照または記述するために使用します。
多くの場合、SQLT値とOCI_TYPECODE値の間で、ダイレクト・マッピングがあります。ただし、1対1のダイレクト・マッピングがない場合もあります。たとえば、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型 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<なし> |
|
|
|
|
|
|
|
|
|
|
|
|
|
OBJECTまたは |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<なし> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<なし> |
|
|
|
|
|
|
|
|
注意:
1. nはバイト単位の文字列サイズです。
2. これらは浮動小数点数で、精度は2進数での桁数です。bは、2進数数値の精度です。
3. これは小数点以下の数値を伴わないNUMBERと等価です。
4. iはバイト単位の数値サイズで、OCIコールの一部として設定されます。
5. pは10進数での数値の精度です。sは10進数での数値のスケール(位取り)です。
6. 名前付きコレクション型の一部としてのみ可能です。