5 データ型
この章は、OCIアプリケーションで使用するOracle外部データ型についてのリファレンスです。
この章では、Oracleデータ型、および独自に作成したプログラムとOracle Databaseの間でデータを転送する場合に行われる、データの内部表現と外部表現の変換についても説明します。
この章には次のトピックが含まれます:
-
関連項目:
Oracle内部データ型の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
5.1 Oracleデータ型
OCIプログラムの重要な機能の1つは、Oracle Databaseと通信を行うことです。
OCIアプリケーションでは、SQL SELECT
を使用した問合せによってデータベースの表からデータを取り出すか、INSERT
、UPDATE
またはDELETE
文を使用して表内の既存データを変更します。
データベース内では、値は表の列に格納されています。内部的には、Oracleは内部データ型という特別な形式でデータを表現します。内部データ型の例として、NUMBER
、CHAR
、DATE
などがあります(表5-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
パラメータで指定する必要があります。詳細は、表5-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内部データ型コードのリストは、「内部データ型」を参照してください。
関連項目:
-
外部データ型の説明は、「DATE」を参照してください
-
Oracle内部データ型の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
-
問合せでの選択リスト項目の記述の詳細は、「選択リスト項目の記述について」を参照してください
5.1.1 外部データ型コードの使用について
外部データ型コードによって、プログラムでのホスト変数のデータ表現方法が指定されます。
これによって、プログラムの出力変数にデータが戻されるときの変換方法、または入力(バインド)変数からOracle Databaseの列値へのデータ変換方法が決まります。たとえば、Oracle Database列のNUMBER
を可変長文字配列に変換する場合は、出力変数を定義するOCIDefineByPos()
コールでVARCHAR2
外部データ型コードを指定します。
バインド変数をOracle Database列の値に変換するには、バインド変数の型に対応する外部データ型コードを指定します。たとえば、02-FEB-65などの文字列をDATE
列に入力する場合は、データ型を文字列として指定し、文字列長パラメータを9に設定します。
使用する値を変換可能にするのは、常にプログラマの責任です。文字列"
MY BIRTHDAY"
をDATE
列に挿入する文を実行すると、エラーが発生します。
関連項目:
外部データ型およびデータ型コードの完全なリストは、表5-2を参照してください。
5.2 内部データ型
内部データ型をリストし、説明します。
表5-1は、Oracle Database内部(組込み)データ型を各型の最大内部長およびデータ型コードとともに示しています。表5-10および表5-11に記載されているPL/SQL型も内部データ型とみなされます。
表5-1 Oracle Database内部データ型
Oracle Database内部データ型 | 最大内部長 | データ型コード |
---|---|---|
|
4000バイト(標準) 32767バイト(拡張) |
1 |
|
21バイト |
2 |
|
2^31-1バイト(2GB) |
8 |
|
7バイト |
12 |
|
2000バイト(標準) 32767バイト(拡張) |
23 |
|
2^31-1バイト |
24 |
|
10バイト |
69 |
|
2000バイト |
96 |
|
4バイト |
100 |
|
8バイト |
101 |
ユーザー定義型(オブジェクト型、 |
該当なし |
108 |
|
該当なし |
111 |
|
128TB |
112 |
|
128TB |
113 |
|
オペレーティング・システムの最大ファイル・サイズまたは |
114 |
|
11バイト |
180 |
|
13バイト |
181 |
|
5バイト |
182 |
|
11バイト |
183 |
|
3950バイト |
208 |
|
11バイト |
231 |
関連項目:
これらの組込みデータ型の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
5.2.1 LONG、RAW、LONG RAW、VARCHAR2
特定のOCI APIによって提供されるピース単位機能を使用して、これらのデータ型の挿入、更新またはフェッチを実行します。
OCIBindByName()
またはOCIBindByName2()
、OCIBindByPos()
またはOCIBindByPos2()
、OCIDefineByPos()
またはOCIDefineByPos2()
、OCIStmtGetPieceInfo()
およびOCIStmtSetPieceInfo()
によって提供されるピース単位機能を使用すると、LONG
、RAW
、LONG RAW
およびVARCHAR2
データ型の列データを扱う挿入、更新またはフェッチを実行できます。
5.2.2 文字列およびバイト配列
文字またはバイト配列を含む列を指定する場合は、Oracle内部データ型を使用します。
文字またはバイト配列を含む列を指定する場合は、CHAR
、VARCHAR2
、RAW
、LONG
およびLONG
RAW
の5つのOracle Database内部データ型を使用できます。
ノート:
LOBには文字を、BFILE
にはバイナリ・データを含めることができます。これらは、他の型とは異なる処理がされるので、ここでは説明しません。
通常、CHAR
列、VARCHAR2
列およびLONG
列には文字データが入ります。RAW
およびLONG
RAW
には、文字として解釈されないバイト(ビットマップ化された画像のピクセル値など)が入ります。ネットワーク間のゲートウェイを介して文字データを渡すと、文字データが変形する可能性があります。1文字を表現するバイト数が異なる別々の言語を使用しているマシン間で文字データを渡すと、長さが大きく変わる可能性があります。RAWデータがこのように変換されることはありません。
表の列ごとに適切なOracle内部データ型を選択するのは、データベースの設計者の責任です。OCIプログラマは、文字データおよびバイト配列データの表現方法、およびOCIプログラムの変数とOracle Database表の間でのデータの変換方法を多数知っておく必要があります。
配列に文字が入っている場合、OCIコール内の配列の長さを示すパラメータは、常に文字単位ではなくバイト単位で渡され、バイト単位で戻されます。
関連項目:
CHAR
、VARCHAR2
、RAW
、LONG
およびLONG
RAW
の各データ型の詳細は、「LOBおよびBFILEの操作」を参照してください
5.2.3 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
記述子)
5.2.4 BINARY_FLOATおよびBINARY_DOUBLE
BINARY_FLOAT
データ型およびBINARY_DOUBLE
データ型は、単精度浮動小数点値および倍精度浮動小数点値を表現し、主に、浮動小数点演算のIEEE754標準に準拠しています。
リリース10.1でこれらのデータ型が追加される前は、Oracle Database内の数値はすべて、Oracle NUMBER
書式で格納されていました。これらの新しいバイナリ浮動小数点型は、Oracle NUMBER
を置換するものではありません。Oracle NUMBER
の代替として機能するため、ディスク領域の使用量が少なくて済むという利点があります。
この内部型は、次のコードで表現されます。
-
BINARY_FLOAT
のSQLT_IBFLOAT
-
BINARY_DOUBLE
のSQLT_IBDOUBLE
次のホスト変数はすべて、BINARY_FLOAT
データ型およびBINARY_DOUBLE
データ型にバインドできます。
-
SQLT_BFLOAT
(システム固有のfloat) -
SQLT_BDOUBLE
(システム固有のdouble) -
SQLT_INT
(integer) -
SQLT_FLT
(float) -
SQLT_NUM
(OracleNUMBER
) -
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
を使用します。
5.3 外部データ型
外部データ型のデータ型コードをリストし、説明します。
表5-2は、外部データ型のデータ型コードを示しています。この表ではデータ型ごとに、Oracle Database内部データの変換元または変換先となる、Cのプログラム変数の型を示しています。
表5-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章を参照してください。
5.3.1 VARCHAR2
VARCHAR2
データ型は、最大長4000バイトの可変長文字列です。
init.ora
のパラメータがmax_string_size = standard
(デフォルト値)の場合、VARCHAR2
の最大の長さは4000バイトです。init.ora
のパラメータがmax_string_size = extended
の場合、VARCHAR2
の最大の長さは32767バイトです。
ノート:
Oracle Databaseオブジェクトを使用する場合は、一連の事前定義済OCI関数を使用することにより、特殊なOCIString
外部データ型を扱うことができます。
関連項目:
-
拡張データ型の詳細は、『Oracle Databaseリファレンス』の
init.ora
のパラメータMAX_STRING_SIZEに関する項を参照してください -
OCIString
外部データ型の詳細は、「OCIのオブジェクト・リレーショナル・データ型」を参照してください
5.3.1.1 入力
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内部(列)データ型がNUMBER
の場合、数値の文字表現が含まれている文字列からの入力は有効です。入力文字列は内部数値形式に変換されます。VARCHAR2
文字列に無効な変換文字が含まれている場合、エラーが戻され、値はデータベースに挿入されません。
5.3.1.2 出力
バインド関数および定義関数の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
が戻されます。
5.3.2 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
外部型を使用します。
5.3.3 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進数値)を、ネイティブ・ホスト変数に対して直接挿入およびフェッチし、これらの整数値に対してフリー演算を実行できます。
5.3.3.1 64ビット整数のOCIバインドおよび定義
64ビット整数のOCIバインドおよび定義のコード・フラグメントを示します。
例5-1は、エラーなく実行されるコード・フラグメントを示しています。
例5-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, ...); ...
5.3.3.2 文を戻すOUTバインドDMLのサポート
文を戻すDMLのOUTバインドの8バイト整数データ型のバインドを説明するコード・フラグメントを示します。
例5-2は、文を戻すDMLのOUTバインドの8バイト整数データ型のバインドを説明するコード・フラグメントを示しています。
例5-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 */ ...
5.3.4 INTEGER
INTEGER
データ型では数値を変換します。
外部INTEGERは符号付きの2進数で、バイト単位のサイズはシステムによって異なります。変数内のバイトの順序は、ホスト・システム・アーキテクチャによって決まります。長さ指定は、入力でも出力でも必須です。Oracle Databaseから戻される数値が整数でない場合、小数部分は廃棄され、エラーやその他の情報は戻されません。戻される数値がシステムの符号付きINTEGERで表現できない場合は、「変換時にオーバーフローが発生しました(overflow on conversion)」エラーが戻されます。
5.3.5 FLOAT
FLOAT
データ型は、小数部分のある数値、またはINTEGERでは表現できない数値を処理します。
数値はホスト・システムの浮動小数点書式で表されます。通常、長さは4バイトか8バイトのいずれかです。長さ指定は、入力および出力の両方について必要です。
Oracle Databaseの数値の内部形式は10進数で、大部分の浮動小数点は2進数であるため、数値を浮動小数点で表現するよりもより高い精度で表現できます。
ノート:
FLOAT
およびNUMBER
間の変換時には丸め処理のエラーが発生する場合もあります。問合せでバインド変数としてFLOAT
を使用すると、ORA-1403
エラーが戻されることがあります。この状況を回避するには、FLOAT
をSTRING
に変換し、VARCHAR2
またはNULL
終了文字列を設定します。
5.3.6 STRING
NULL
文字で終了するSTRING
形式は、文字列にNULL
終端文字が必要であることを除けば、VARCHAR2
形式と同じように動作します。
5.3.6.1 入力
OCIBindByName()
またはOCIBindByPos()
コールで供給される文字列の長さによって、NULL
終端文字があるかどうかのスキャンの範囲が制限されます。
NULL
終端文字が指定された中で見つからなかった場合は、次のエラーとなります。
ORA-01480: STR
バインド値に終了のNULL
がありません。
バインド・コールで長さが指定されていない場合、OCIは、文字列の暗黙の最大長の4000を使用します。
文字列の最小の長さは2バイトです。最初の文字がNULL
終端文字であり、長さが2と指定されている場合、許可されていればNULL
が列に挿入されます。VARCHAR2
型およびCHAR
型とは異なり、空白のみを含む文字列は入力時にNULL
として扱われるのではなく、そのまま挿入されます。
ノート:
NULL
で終了する文字列の文字列長パラメータに、-1を渡すことはできません。
5.3.7 VARNUM
VARNUM
データ型は、最初のバイトに数値表現の長さが記述されることを除けば、外部NUMBER
データ型と同じです。
この長さには、長さを記述するバイト自体は含まれません。最大長のVARNUM
に備えて、22バイトを確保してください。VARNUM
値をOracle Databaseに送信するときは、長さを記述するバイトを設定します。
表5-3に、表の数値に戻されるVARNUM
値の例をいくつか示します。
表5-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 |
該当なし |
5.3.8 LONG
LONG
データ型では、4001バイト以上の文字列を格納します。
LONG
列には、最大2GB (2^31-1バイト)を格納できます。この列の型は、長い文字列の格納およびフェッチにのみ使用します。関数、式またはWHERE
句では使用できません。一般的に、LONG
列値の変換は、文字列との間で行われます。
LONG
列を使用した表を作成しないでください。かわりに、LOB
列(CLOB
、NCLOB
またはBLOB
)を使用してください。LONG
列は、下位互換性のためにサポートされています。
既存のLONG
列をLOB
列に変換することもお薦めします。LOB
列の制限の数は、LONG
列の制限の数よりも、かなり少なくなっています。さらに、LOB
機能はすべてのリリースで拡張されていますが、LONG
機能は複数のリリースで変更されていません。
5.3.9 VARCHAR
VARCHAR
データ型では、可変長の文字列が格納されます。
先頭の2バイトには文字列の長さが記述され、残りのバイトには文字列が含まれます。バインド・コールまたは定義コールで指定する文字列の長さには、この2バイトを含める必要があるため、送受信可能なVARCHAR
文字列の最大長は、65535バイトではなく、65533バイトになります。
5.3.10 DATE
DATE
データ型では、Oracle内部日付バイナリ形式を使用して、日付の値の更新、挿入または検索を行うことができます。
バイナリ形式の日付は、表5-4に示すとおり7バイトです。
表5-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
データ型を扱うことができます。
関連項目:
-
OCIDate
データ型の詳細は、「日付(OCIDate)」を参照してください -
DATETIME
およびINTERVAL
データ型の詳細は、「日時および時間隔のデータ型記述子」を参照してください
5.3.11 RAW
RAW
データ型は、たとえば図形文字列の格納など、Oracle Databaseで解釈されないバイナリ・データまたはバイト列で使用されます。
RAW
列の最大長は2000バイトです。init.ora
のパラメータがmax_string_size = standard
(デフォルト値)の場合、RAW
の最大の長さは2000バイトです。init.ora
のパラメータがmax_string_size = extended
の場合、RAW
の最大の長さは32767バイトです。
Oracle Database表内のRAW
データがプログラムで文字列に変換される場合、データは16進文字コードで表されます。RAW
データの各バイトは、それぞれの値を示す'00'〜'FF'の2文字で戻されます。プログラムの文字列をOracle Database表内のRAW
列に入力する場合は、この16進コードを使用して文字列のデータをコード化する必要があります。
OCIDefineByPos()
、OCIBindByName()
、OCIBindByPos()
、OCIStmtGetPieceInfo()
およびOCIStmtSetPieceInfo()
によって提供されるピース単位機能を使用すると、RAW
列(またはLONG
RAW
列)を扱う挿入、更新またはフェッチを実行できます。
Oracle Databaseでオブジェクトを使用する場合は、一連の事前定義済OCI関数を使用して、特殊なOCIRaw
データ型を扱うことができます。
関連項目:
-
MAX_STRING_SIZE
の詳細は、『Oracle Database SQL言語リファレンス』を参照してください -
拡張データ型の詳細は、『Oracle Databaseリファレンス』の
init.ora
のパラメータMAX_STRING_SIZEに関する項を参照してください -
このデータ型の詳細は、「ロー(OCIRaw)」を参照してください
5.3.12 VARRAW
VARRAW
データ型は、RAW
データ型に類似しています。
ただし、先頭の2バイトにはデータの長さが記述されます。バインド・コールまたは定義コールで指定する文字列の長さには、この2バイトを含める必要があるため、送受信可能なVARRAW
文字列の最大長は、65535バイトではなく、65533バイトになります。これより長い文字列を変換する場合は、LONG
VARRAW
外部データ型を使用します。
5.3.13 LONG RAW
LONG
RAW
データ型は、2 GB長をサポートしています。
LONG
RAW
データ型は、最大2GB (2^31-1バイト)のRAWデータを格納できるということを除けば、RAW
データ型と同じです。
5.3.14 UNSIGNED
UNSIGNED
データ型は、符号なし2進整数に対して使用されます。
バイト単位のサイズは、システムによって異なります。ワード内のバイトの順序は、ホスト・システムのアーキテクチャによって決まります。長さ指定は、入力でも出力でも必須です。Oracle Databaseから出力される数値が整数でない場合、小数部分は廃棄され、エラーやその他の情報は戻されません。戻される数値がシステムの符号なし整数より大きくて表現できない場合、「変換時にオーバーフローが発生しました(overflow on conversion)」というエラーが戻されます。
5.3.15 LONG VARCHAR
LONG
VARCHAR
データ型は、Oracle DatabaseのLONG
列からデータを格納する場合、またはこの列にデータを格納する場合に使用します。
LONG
VARCHAR
の先頭の4バイトには項目の長さが記述されます。したがって、格納される項目の最大長は、2^31-5バイトです。
5.3.16 LONG VARRAW
LONG
VARRAW
データ型は、Oracle Database LONG
RAW
列からデータを格納する場合、またはこの列にデータを格納する場合に使用します。
長さは、先頭の4バイトに記述されます。最大長は、2^31-5バイトです。
5.3.17 CHAR
CHAR
データ型は、最大長2000バイトの可変長文字列です。
5.3.17.1 入力
長さは、OCIBindByName()
またはOCIBindByName2()
、あるいはOCIBindByPos()
またはOCIBindByPos2()
コールのvalue_sz
パラメータによって決まります。
ノート:
バッファの全内容(value_sz
の文字数)は、後続の空白またはNULL
もすべて含めてデータベースに渡されます。
value_sz
パラメータが0 (ゼロ)の場合、バインド変数は、実際の内容とは無関係にNULL
として処理されます。NULL
は、SQL文のバインド変数値として使用できます。NOT
NULL
整合性制約付きの列にNULL
を挿入しようとすると、エラーとなり、行は挿入されません。
CHAR
の場合、value_sz
パラメータには負の値を使用できません。
Oracle内部(列)データ型がNUMBER
の場合、数値の文字表現が含まれている文字列からの入力は有効です。入力文字列は内部数値形式に変換されます。CHAR
文字列に無効な変換文字が含まれている場合、エラーが戻され、値は挿入されません。数値変換は、使用しているシステムのグローバリゼーション・サポートの設定値によって規定される規則に従って行われます。たとえば、システムが、ピリオドではなくカンマを小数点として認識するように構成されている場合もあります。
5.3.17.2 出力
OCIDefineByPos()
またはOCIDefineByPos2()
コールのvalue_sz
パラメータで、戻り値の希望の長さを指定します。
長さとしてゼロを指定した場合、データは戻されません。
OCIDefineByPos()
またはOCIDefineByPos2()
のrlenp
パラメータを省略すると、戻される値はバッファ長に達するまで空白が埋め込まれ、空白文字の文字列としてNULL
が戻されます。rlenp
を指定した場合、戻り値は空白埋めされません。かわりに、実際の長さがrlenp
パラメータに戻されます。
NULL
が戻されたかどうか、または文字の切捨てが発生したかどうかをチェックするには、OCIDefineByPos()
またはOCIDefineByPos2()
コールにインジケータ・パラメータまたはインジケータ・パラメータの配列を指定します。インジケータ・パラメータには、NULL
がフェッチされた場合は-1が設定され、値が切り捨てられて戻された場合は元の列の長さが設定されます。それ以外の場合は、0 (ゼロ)が設定されます。インジケータ・パラメータを指定していない場合、NULL
が選択されると、フェッチ・コールでORA-01405
エラーが戻されます。
内部NUMBER
データ型から文字列への出力を要求することもできます。数値変換は、使用しているシステムのグローバリゼーション・サポートの設定値によって規定される規則に従って行われます。たとえば、システムが、ピリオド(.)ではなくカンマ(,)を小数点として認識するように構成されている場合もあります。
関連項目:
5.3.18 CHARZ
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データ型を説明する際に、それらの定数を使用します。また、データ型定数は、これらの新しい型を参照するときに、このマニュアルの他の章でも使用されます。
5.3.19 名前付きデータ型: オブジェクト、VARRAY、ネストした表
名前付きデータ型は、SQLのCREATE
TYPE
コマンドで指定するユーザー定義の型です。
例として、オブジェクト型、VARRAY、NESTED TABLEなどがあります。OCIでは、名前付きデータ型は型のホスト言語による表現を意味します。SQLT_NTY
データ型コードは、名前付きデータ型をバインドまたは定義する際に使用します。
Cアプリケーションでは、名前付きデータ型はC構造体として表されます。このような構造体は、データベース内に格納された型からObject Type Translatorを使用して生成されます。これらの型は、OCI_TYPECODE_OBJECT
に対応します。
関連項目:
-
OCIでの名前付きデータ型の処理の詳細は、「オブジェクト型情報の格納およびアクセス」を参照してください
-
名前付きデータ型のC構造体としての表現方法の詳細は、「OCIでのObject Type Translatorの使用」を参照してください
5.3.20 REF
これは名前付きデータ型への参照です。
REF
のC言語表現は、OCIRef *
型として宣言された変数です。SQLT_REF
データ型コードは、REF
をバインドまたは定義する際に使用します。
REF
にアクセスできるのは、OCIアプリケーションをオブジェクト・モードで初期化した場合のみです。サーバーからREF
が取り出されると、REFはクライアント側のオブジェクト・キャッシュに格納されます。
アプリケーションで使用するREF
を割り当てるには、変数をREF
へのポインタとして宣言し、OCI_TYPECODE_REF
をtypecode
パラメータとして渡すOCIObjectNew()
をコールします。
関連項目:
-
OCIで
REF
を使用する場合の詳細は、「OCIのオブジェクトに関する高度なトピック」を参照してください
5.3.21 ROWID記述子
ROWID
データ型は、データベースの表の特定の行を識別するために使用されます。
ROWID
は、次のように、問合せの選択リスト項目になっている場合があります。
SELECT ROWID, ename, empno FROM emp
このケースでは、戻されたROWID
を後続のDELETE
文で使用できます。
SELECT
FOR UPDATE
を実行する場合、ROWID
は暗黙的に戻されます。文ハンドルでOCIAttrGet()
を使用して、このROWID
をユーザーが割り当てたROWID
記述子に読み取り、後続のUPDATE
文で使用できます。プリフェッチ操作ではSELECT
FOR UPDATE
のすべてのROWID
がフェッチされるため、プリフェッチを使用してから単一行フェッチを行います。
ROWIDへのアクセスはROWID
記述子を使用して行い、この記述子はバインド変数または定義変数として使用できます。
関連項目:
-
ROWID
記述子の使用方法の詳細は、「OCI記述子」および「位置指定の更新および削除」を参照してください
5.3.22 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
)パラメータは常に、バイトではなく固定幅文字セットの文字として解釈されます。
関連項目:
-
LOBロケータなどの記述子の詳細は、「OCI記述子」を参照してください
-
LOBの詳細は、『Oracle Database SQL言語リファレンス』および『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください
-
OCI LOB関数の詳細は、「LOBおよびBFILEの操作」を参照してください
5.3.22.1 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およびラージ・オブジェクト開発者ガイド』を参照してください
5.3.22.2 BLOB
BLOB
データ型は、構造化されていないバイナリ・ラージ・オブジェクトを格納するために使用します。
BLOB
は、文字セットのセマンティクスを持たないビット・ストリームと考えられます。BLOB
には、最大128TBのバイナリ・データを格納できます。
BLOB
はトランザクションを完全にサポートしており、OCIを通じて行った変更は、完全にトランザクションで使用できます。BLOB
値に対して行った操作は、コミットまたはロールバックできます。1つのトランザクション内で変数のBLOB
ロケータを保存し、次にそれを別のトランザクションまたはセッションで使用することはできません。
5.3.22.3 CLOB
CLOB
データ型には固定幅または可変幅の文字データが格納されます。
CLOB
には、最大128TBの文字データを格納できます。
CLOB
はトランザクションを完全にサポートしており、OCIを通じて行った変更は、完全にトランザクションで使用できます。CLOB
値に対して行った操作は、コミットまたはロールバックできます。1つのトランザクション内で変数のCLOB
ロケータを保存し、次にそれを別のトランザクションまたはセッションで使用することはできません。
5.3.23 日時および時間隔のデータ型記述子
日時および時間隔のデータ型記述子をリストし、説明します。
ここでは、日時および時間隔のデータ型記述子について簡単に説明します。
5.3.23.1 ANSI DATE
ANSI
DATE
データ型はDATE
データ型が基本になっていますが、時間部分は含まれていません。タイム・ゾーンもありません。
ANSI
DATE
は、DATE
データ型のANSI仕様に従います。ANSI
DATE
をDATE
データ型またはTIMESTAMPデータ型に割り当てると、OracleのDATE
やTIMESTAMPの時間部分は0 (ゼロ)に設定されます。DATE
データ型またはTIMESTAMPデータ型をANSI
DATE
に割り当てると、時間部分は無視されます。
ANSI DATE
データ型を使用するかわりに、日付と時間の両方を含むTIMESTAMP
データ型の使用をお薦めします。
5.3.23.2 TIMESTAMP
TIMESTAMPデータ型は、DATEデータ型を拡張したものです。
DATE
データ型の年、月および日に加えて、時、分および秒の値を格納します。
TIMESTAMP
データ型にはタイム・ゾーンがありません。TIMESTAMP
データ型の形式は次のとおりです。
TIMESTAMP(fractional_seconds_precision)
この書式では、オプションのfractional_seconds_precision
で、SECOND
日時フィールドの小数部分の桁数を指定し、桁数は0から9を指定できます。デフォルトは6です。
5.3.23.3 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
オフセットにかかわらず、同一であるとみなされます。
5.3.23.4 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です。
5.3.23.5 INTERVALYEARTOMONTH
INTERVAL
YEAR
TO
MONTH
は、YEAR
およびMONTH
日時フィールドを使用して期間を格納します。
INTERVAL
YEAR
TO
MONTH
データ型の書式は次のとおりです。
INTERVAL YEAR(year_precision) TO MONTH
この書式では、オプションのyear_precision
で、YEAR
日時フィールドの桁数を指定します。year_precision
のデフォルト値は2です。
5.3.23.6 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桁は切り捨てられます。
5.3.23.7 日時を使用する際の予期しない結果の回避について
日時を使用する際の予期しない結果の回避方法について説明します。
ノート:
日時データのデータ操作言語(DML)の操作での予期しない結果を回避するために、組込みSQL関数のDBTIMEZONE
とSESSIONTIMEZONE
を問い合せて、データベースとセッションのタイム・ゾーンを確認できます。タイム・ゾーンを手動で設定していない場合、デフォルトでオペレーティング・システムのタイム・ゾーンが使用されます。オペレーティング・システムのタイム・ゾーンが有効なOracle Databaseタイム・ゾーンでない場合、UTCがデフォルト値として使用されます。
5.3.24 システム固有のfloatおよびdouble
システム固有のfloat (SQLT_BFLOAT
)およびシステム固有のdouble(SQLT_BDOUBLE
)データ型は、単精度浮動小数点値および倍精度浮動小数点値を表現します。
これらは、システムに固有の書式、つまりホスト・システムの浮動小数点書式で表されます。
これらの外部型は、BINARY_FLOAT
およびBINARY_DOUBLE
内部データ型を外部で表すために、リリース10.1で追加されました。したがって、内部型は、外部型のシステム固有のfloatおよびdoubleとともにそれぞれ使用したときに、最適なパフォーマンスが得られます。これにより、浮動小数点値の既存の表現(SQLT_FLT
)とこれらの型は、明確に区別されます。
5.3.25 Cオブジェクト・リレーショナル・データ型マッピング
OCIでは、ユーザー定義のデータ型をC表現にマッピングするために使用される、Oracle定義のCデータ型がサポートされています(OCINumber
、OCIArray
など)。
OCIには、これらのデータ型で動作し、これらのデータ型をOCI外部データ型とともに、バインド操作および定義操作で使用する一連のOCIコールが用意されています。
関連項目:
これらのOracle定義のCデータ型の使用方法の詳細は、「OCIでのオブジェクト・リレーショナル・データ型」を参照してください
5.4 データ変換
サポートされている、内部データ型から外部データ型への変換、および外部データ型から列の内部表現への変換を示します。
表5-5は、リリース7.3で使用可能な全データ型についてサポートされている、内部データ型から外部データ型、および外部データ型から内部列表現への変換を示しています。リリース7.3より後に追加された新しいデータ型のデータ変換の詳細は、次のとおりです。
-
データベースに格納されているREFは、出力時に
SQLT_REF
に変換されます。 -
SQLT_REF
は、入力時にREF
の内部表現に変換されます。 -
データベースに格納されている名前付きデータ型は、出力時に
SQLT_NTY
に変換されます(アプリケーション内ではC構造体で表現されます)。 -
SQLT_NTY
(アプリケーション内ではC構造体で表現されます)は、入力時に、対応する型の内部表現に変換されます。
表の幅が限られているため、LOBについては表5-6にリストされています。
関連項目:
OCIString
、OCINumber
およびその他の新しいデータ型の詳細は、「OCIでのオブジェクト・リレーショナル・データ型」を参照してください
表5-5 データ変換
NA(4) | 内部データ型-> | NA | NA | NA | NA | NA | NA | NA | NA |
---|---|---|---|---|---|---|---|---|---|
外部データ型 | VARCHAR2 | NUMBER | LONG | ROWID | UROWID | DATE | RAW | LONG RAW | CHAR |
|
I/O脚注 5 |
I/O |
I/O |
I/O脚注 6 |
I/O脚注 6 |
I/O脚注 7 |
I/O脚注 8 |
I/O脚注 8 |
NA |
|
I/O脚注 9 |
I/O |
NA |
NA |
NA |
NA |
NA |
I/O脚注 9 |
|
|
I/O脚注 9 |
I/O |
I |
NA |
NA |
NA |
NA |
NA |
I/O脚注 9 |
|
I/O脚注 9 |
I/O |
I |
NA |
NA |
NA |
NA |
NA |
I/O脚注 9 |
|
I/O |
I/O |
I/O |
I/O脚注 6 |
I/O脚注 6 |
I/O脚注 7 |
I/O脚注 8 |
I/O |
|
|
I/O脚注 9 |
I/O |
I |
NA |
NA |
NA |
NA |
NA |
I/O脚注 9 |
|
I/O脚注 9 |
I/O |
I |
NA |
NA |
NA |
NA |
NA |
I/O脚注 9 |
|
I/O |
I/O |
I/O |
I/O脚注 6 |
I/O脚注 6 |
I/O脚注 7 |
I/O脚注 8 |
I/O |
|
|
I/O |
I/O |
I/O |
I/O脚注 6 |
I/O脚注 6 |
I/O脚注 7 |
I/O脚注 8 |
I/O |
|
|
I/O |
NA |
I |
NA |
NA |
I/O |
NA |
NA |
I/O |
|
I/O脚注 12 |
NA |
NA |
NA |
NA |
I/O |
I/O |
I/O脚注 12 |
|
|
I/O脚注 12 |
NA |
NA |
NA |
NA |
I/O |
I/O |
I/O脚注 12 |
|
|
NA |
NA |
NA |
NA |
I/O |
I/O |
O脚注12 |
||
|
I/O脚注 9 |
I/O |
I |
NA |
NA |
NA |
NA |
NA |
I/O脚注 9 |
|
I/O |
I/O |
I/O |
I/O脚注 6 |
I/O脚注 6 |
I/O脚注 7 |
I/O脚注 8 |
I/O |
|
|
I/O脚注 12 |
NA |
NA |
NA |
NA |
I/O |
I/O |
I/O脚注 12 |
|
|
I/O |
I/O |
I/O |
I/O脚注 6 |
I/O脚注 6 |
I/O脚注 7 |
I/O脚注 8 |
I脚注8 |
I/O |
|
I/O |
I/O |
I/O |
I/O脚注 6 |
I/O脚注 6 |
I/O脚注 7 |
I/O脚注 8 |
I脚注8 |
I/O |
|
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 = 変換は出力時のみ有効です。
5.4.1 LOBデータ型記述子のデータ変換
LOB
のデータ変換を示します。
表5-6では、LOB
のデータ変換を示しています。たとえば、外部文字データ型(VARCHAR
、CHAR
、LONG
およびLONG VARCHAR
)は、内部CLOB
データ型に変換されるのに対して、外部RAWデータ型(RAW
、VARRAW
、LONG RAW
およびLONG VARRAW
)は、内部BLOB
データ型に変換されます。
表5-6 LOBのデータ変換
外部データ型 | 内部CLOB | 内部BLOB |
---|---|---|
|
I/O脚注 14 |
NA脚注 15 |
|
I/O |
NA |
|
I/O |
NA |
|
I/O |
NA |
|
NA |
I/O |
|
NA |
I/O |
|
NA |
I/O |
|
NA |
I/O |
脚注14
I/O = 変換は入力時または出力時に有効です。
脚注15
NAは、該当なしを意味します。
5.4.2 日時および時間隔データ型のデータ変換
日時および時間隔データ型のデータ変換を示します。
文字データ型のいずれかを、日時列または時間隔列のフェッチ操作または挿入操作で使用するホスト変数に対して使用することもできます。Oracle Databaseでは、文字データ型と日時データ型または時間隔データ型との間の変換が行われます(表5-7を参照)。
表5-7 日時および時間隔データ型のデータ変換
外部データ型/内部データ型 | VARCHAR、CHAR | DATE | TS | TSTZ | TSLTZ | INTERVALYEARTOMONTH | INTERVALDAYTOSECOND |
---|---|---|---|---|---|---|---|
|
I/O脚注 16 |
I/O |
I/O |
I/O |
I/O |
I/O |
I/O |
|
I/O |
I/O |
I/O |
I/O |
I/O |
NA脚注 17 |
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 |
脚注16
I/O = 変換は入力時または出力時に有効です。
脚注17
NAは、該当なしを意味します。
5.4.2.1 割当てに関するノート
タイム・ゾーンがあるソースを、タイム・ゾーンのないターゲットに割り当てると、ソースのタイム・ゾーン部分は無視されます。
タイム・ゾーンのないソースを、タイム・ゾーンがあるターゲットに割り当てると、ターゲットのタイム・ゾーンには、セッションのデフォルト・タイム・ゾーンが設定されます。
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
文字形式であることが必要です。
5.4.2.2 日時および時間隔型のデータ変換に関するノート
日時データ型および時間隔データ型に関する情報について説明します。
TSLTZ
からCHAR
、DATE
、TIMESTAMP
およびTSTZ
に変換すると、値はセッションのタイム・ゾーンに合せて調整されます。
CHAR
、DATE
およびTIMESTAMP
をTSLTZ
に変換すると、セッションのタイム・ゾーンはメモリー内に格納されます。
TSLTZ
をANSI
DATE
に変換すると、TIME部分には0 (ゼロ)が設定されます。
TSTZ
から変換すると、タイム・スタンプを含むタイム・ゾーンはメモリー内に格納されます。
文字列をINTERVALに割り当てる場合、その文字列が有効なINTERVAL文字形式であることが必要です。
5.4.3 日時および日付のアップグレード規則
OCIでは、日時列および日付列について、クライアント・アプリケーションとOracle Database間の完全な上位互換性および下位互換性を備えています。
5.4.3.1 9.0より前のクライアントと9.0以上のサーバー
9.0より前のアプリケーションで使用できる日時データ型は、DATE
データ型のSQLT_DAT
のみです。
バッファをSQLT_DAT
に定義した9.0より前のクライアントでTSLTZ
列からデータを取得しようとすると、値の日付部分のみがクライアントに戻されます。
5.4.3.2 9.0より前のサーバーと9.0以上のクライアント
9.0より前のサーバーを9.0以上のクライアントとともに使用する場合、クライアントにSQLT_TIMESTAMP_LTZ
型のバインド・バッファまたは定義バッファがある場合があります。
この場合は、次の互換性が維持されます。
クライアント・アプリケーションで、SQLT_TIMESTAMP_LTZ
(または新しい日時データ型)をDATE
列に挿入しようとすると、データが失われる可能性があるため、エラーが発生します。
クライアントにSQLT_TIMESTAMP_LTZ
データ型のOUTバインド・バッファまたは定義バッファがあり、サーバー側の基礎となるSQLバッファまたは列がDATE
型の場合は、セッションのタイム・ゾーンが割り当てられます。
5.4.4 OCIでのBINARY_FLOATおよびBINARY_DOUBLEのデータ変換
内部数値データ型と、関連するすべての外部型との間でサポートされている変換を示します。
表5-8に、内部数値データ型と関連するすべての外部型の間でサポートされている変換を示します。(I)は変換が入力のみ(バインド)に有効であることを示し、(O)は変換が出力のみ(定義)に有効であることを示します。(I/O)は変換が入力と出力(バインドおよび定義)の両方に有効であることを示します。
表5-8 外部データ型から内部数値データ型へのデータ変換
外部データ型/内部データ型 | BINARY_FLOAT | BINARY_DOUBLE |
---|---|---|
|
I/O脚注 18 |
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 |
脚注18
(I/O)は変換が入力と出力(バインドおよび定義)の両方に有効であることを示します
表5-9に、関連するすべての内部型と外部数値データ型の間でサポートされている変換を示します。(I)は変換が入力のみ(バインドの場合のみ)に有効であることを示し、(O)は変換が出力のみ(定義の場合のみ)に有効であることを示します。(I/O)は変換が入力と出力(バインドおよび定義)の両方に有効であることを示します。
表5-9 内部データ型から外部数値データ型へのデータ変換
内部データ型/外部データ型 | システム固有のfloat | システム固有のdouble |
---|---|---|
|
I/O脚注 19 |
I/O |
|
I/O |
I/O |
|
I |
|
|
I/O |
I/O |
|
I/O |
I/O |
|
I/O |
I/O |
脚注19
(I/O)は変換が入力と出力(バインドおよび定義)の両方に有効であることを示します
脚注20
(I)は変換が入力のみ(バインドの場合のみ)に有効であることを示します
5.5 型コード
固有の型コードは、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
値を返します。
表5-10は、OCITypeCode
に可能な値を示しています。各Oracleデータ型に対応する値があります。
表5-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 |
|
コレクション |
|
ブール |
|
レコード |
|
索引付きBINARY_INTEGER |
|
PLS_INTEGERまたはBINARY_INTEGER |
脚注21
この型はPL/SQL型のみです。
この項には次のトピックが含まれます: SQLT値およびOCI_TYPECODE値の関係。
5.5.1 SQLT値およびOCI_TYPECODE値の関係
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
型にマップされます。
表5-11では、SQLT
型とOCI_TYPECODE
型の間のマッピングを示します。
表5-11 OCI_TYPECODEからSQLTへのマップ
Oracle型システムの型名 | Oracle型システムの型 | 等価SQLT型 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<なし> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<なし> |
|
|
|
|
|
|
|
|
|
|
|
<なし> |
|
|
|
|
|
|
脚注22
この型はPL/SQL型のみです。
脚注23
nはバイト単位の文字列サイズです。
脚注24
これらは浮動小数点で、精度は2進数での桁数です。bは、2進数数値の精度です。
脚注25
これは小数点以下の数値を伴わないNUMBERと等価です。
脚注26
iはバイト単位の数値サイズで、OCIコールの一部として設定されます。
脚注27
pは10進数での数値の精度です。sは10進数での数値のスケール(位取り)です。
脚注28
名前付きコレクション型の一部としてのみ可能です。