この章は、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. 名前付きコレクション型の一部としてのみ可能です。