5 データ型
この章には、Oracle C++ Call Interfaceアプリケーションで使用するOracleデータ型のリファレンスが記載されています。この情報は、アプリケーションとデータベース・サーバー間におけるデータ転送時に発生する、データの内部表現と外部表現との間の変換を理解するのに役立ちます。
この章には次のトピックが含まれます:
Oracleデータ型の概要
C++プログラムとOracleデータベース・サーバー間では、通信を正確に行うことが重要です。OCCIアプリケーションでは、SQL問合せを使用してデータベース表からデータを取り出すか、SQLのINSERT
、UPDATE
およびDELETE
関数を使用して既存のデータを変更できます。ホスト言語のC++とデータベース・サーバー間の通信を容易に行うには、C++データ型とOracleデータ型間の変換方法を理解する必要があります。
Oracleデータベースでは、値は表内の列に格納されています。Oracle内部では、データは内部データ型と呼ばれる特定フォーマットで表現されます。NUMBER
、VARCHAR2
およびDATE
などは、このOracle内部データ型の例です。
OCCIアプリケーションでは、ホスト言語データ型、またはホスト言語によって事前定義された外部データ型を使用します。データがOCCIアプリケーションとデータベース・サーバーの間で移動する際、データベースのデータは、内部データ型から外部データ型に変換されます。
この項には、トピック「OCCI型とデータ変換について」が含まれています。
OCCI型とデータ変換について
OCCIでは、OCCIアプリケーションで利用可能なデータ表記フォーマットを列挙するType
と呼ばれる列挙子が定義されています。それらの表記形式は、外部データ型と呼ばれます。データがOCCIアプリケーションからデータベース・サーバーに送信されると、外部データ型によってデータベース・サーバーはどの形式のデータを予想すべきかが示されます。OCCIアプリケーションによってデータベース・サーバーからデータを要求されると、戻されるデータの形式が外部データ型によって示されます。
たとえば、NUMBER
列からの値の取得時に、プログラムはOCCIINT
形式(符号付き整数フォーマットの整数値)でその値を取得するように設定できます。もしくは、クライアントは、NUMBER
型の列に挿入されるC++のfloat型変数に格納されたOCCIFLOAT
形式(浮動小数点形式)のデータを送信するように設定できます。
OCCIアプリケーションでは、set
xxx
()
メソッド(外部データ型
はメソッド名によって暗黙的に指定されます)をコールするか、registerOutParam()
、setDataBuffer()
またはsetDataBufferArray()
メソッド(外部データ型はメソッドのコールによって明示的に指定されます)をコールして、入力パラメータをStatement
にバインドします。同様に、データ値がResultSet
オブジェクトを使用してフェッチされた場合は、取り出したデータの外部表現を指定する必要があります。この指定は、get
xxx
()
メソッド(外部データ型
はメソッド名によって暗黙的に指定されます)をコールするか、setDataBuffer()
メソッド(外部データ型はメソッドのコールによって明示的に指定されます)をコールして行います。
外部データ型は、内部データ型より多くあります。単一の外部データ型が単一の内部データ型にマップされる場合や、多数の外部データ型が単一の内部データ型にマップされる場合があります。この多対1のマッピングによって、柔軟性が向上します。
関連項目:
内部データ型
この項では、Oracleが提供する内部(組込み)データ型について説明します。説明、コード、最大サイズなど、Oracle内部データ型の概要は、表5-1を参照してください。
表5-1 Oracle内部データ型の概要
内部データ型 | 最大サイズ |
---|---|
BFILE |
4GB |
BINARY_DOUBLE |
8バイト |
BINARY_FLOAT |
4バイト |
CHAR |
2,000バイト |
DATE |
7バイト |
INTERVAL DAY TO SECOND REF |
11バイト |
INTERVAL YEAR TO MONTH REF |
5バイト |
LONG |
2GB (2^31-1バイト) |
LONG RAW |
2GB (2^31-1バイト) |
NCHAR |
2,000バイト |
NUMBER |
21バイト |
NVARCHAR2 |
32,767バイト |
RAW |
2000バイト(標準)、32,767バイト(拡張) |
REF |
該当なし |
BLOB |
4GB |
CLOB |
4GB |
NCLOB |
4GB |
ROWID |
10バイト |
TIMESTAMP |
11バイト |
TIMESTAMP WITH LOCAL TIME ZONE |
7バイト |
TIMESTAMP WITH TIME ZONE |
13バイト |
UROWID |
4000バイト |
ユーザー定義型(オブジェクト型、 |
該当なし |
VARCHAR2 |
4000バイト(標準)、32,767バイト(拡張) |
文字列およびバイト配列
文字またはバイト配列を含む列を指定する場合は、CHAR
、VARCHAR2
、RAW
、LONG
およびLONG
RAW
の5つのOracle内部データ型を使用できます。
通常、CHAR
列、VARCHAR2
列およびLONG
列には文字データが入ります。RAW
とLONG
RAW
は、ビットマップ化された画像のピクセル値など、文字として解釈されないバイトを保持します。文字データは、ネットワーク間のゲートウェイを介して渡すと、変形する可能性があります。たとえば、異なる言語(単一の文字が異なるバイト数で表現される)を使用しているシステム間で文字データを渡すと、データの長さが大幅に変更される可能性があります。RAWデータがこのように変換されることはありません。
適切なOracle内部データ型を表内の各列に対して選択するのは、データベース設計者の役割です。文字データとバイト配列データを表現する方法、およびOCCIプログラムの変数とOracleデータベース表間でデータを変換する方法には、様々な方法があることを理解しておく必要があります。
ユニバーサルROWID(UROWID)
ユニバーサルROWID (UROWID
)は、Oracle表、およびゲートウェイを使用してアクセスするDB2表などの外部キー表の行に対する論理ROWIDと物理ROWIDを格納できるデータ型です。論理ROWID
の値は、索引構成表の行に対する主キー・ベースの論理識別子です。
UROWID
データ型の列を使用するには、COMPATIBLE
初期化パラメータの値を8.1
以上に設定する必要があります。
次のOCCI_SQLT
型は、ユニバーサルROWID
にバインドできます。
-
OCCI_SQLT_CHR
(VARCHAR2
) -
OCCI_SQLT_VCS
(VARCHAR
) -
OCCI_SQLT_STR
(NULL
終了文字列) -
OCCI_SQLT_LVC
(longVARCHAR
) -
OCCI_SQLT_AFC
(CHAR)
-
OCCI_SQLT_AVC
(CHARZ
) -
OCCI_SQLT_VST
(文字列) -
OCCI_SQLT_RDD
(ROWID
記述子)
外部データ型
OCCIアプリケーションは、外部データ型を使用してOracleデータベース・サーバーと通信します。具体的には、外部データ型がC++データ型にマップされます。
表5-2は、Oracle外部データ型、等価のC++データ型(Oracle内部データ型からの通常の変換先)および対応するOCCI型を示しています。次の条件に注意してください。
-
C++データ型列では、
n
は変数長を表し、プログラム要件またはオペレーティング・システムに依存します。 -
Statement
クラスのメソッドにおける型の使用方法は次のとおりです。-
setDataBuffer()
およびsetDataBufferArray()
:occiCommon.h
ファイルのOCCI_SQLT_
xxx
フォーム(OCCI_SQLT_INT
など)のデータ型のみ使用できます。 -
registerOutParam()
:occiCommon.h
ファイルのOCCI
xxx
フォーム(OCCIDOUBLE
、OCCICURSOR
など)のデータ型のみ使用できます。ただし、いくつか例外があります。OCCIANYDATA
、OCCIMETADATA
、OCCISTREAM
およびOCCIBOOL
は使用できません。
-
-
ResultSet
クラスでは、occiCommon.h
ファイルのOCCI_SQLT_
xxx
フォーム(OCCI_SQLT_INT
など)のデータ型のみが、setDataBuffer()
およびsetDataBufferArray()
メソッドで使用できます。 -
TIMESTAMP
データ型とTIMESTAMP
WITH
TIME
ZONE
データ型は、総称して日時データ型と呼ばれています。INTERVAL
YEAR
TO
MONTH
データ型とINTERVAL
DAY
TO
SECOND
データ型は、総称して間隔データ型と呼ばれています。
表5-2 外部データ型と対応するC++型およびOCCI型
外部データ型 | C++型 | OCCI型 | 使用上の注意 |
---|---|---|---|
16ビット符号付き |
signed short, signed int |
OCCIINT |
|
32ビット符号付き |
signed int, signed long |
OCCIINT |
|
8ビット符号付き |
signed char |
OCCIINT |
|
|
Bfile |
OCCIBFILE |
|
|
OCILobLocator |
OCCI_SQLT_FILE |
|
|
OCILobLocator |
OCCI_SQLT_BLOB |
|
|
Blob |
OCCIBLOB |
|
|
bool |
OCCIBOOL |
|
|
Bytes |
OCCIBYTES |
|
|
char[n] |
OCCI_SQLT_AFC |
|
|
string |
OCCICHAR |
|
|
OCILobLocator |
OCCI_SQLT_CLOB |
|
|
char[n+1] |
OCCI_SQLT_RDD |
|
|
Clob |
OCCICLOB |
|
|
ResultSet |
OCCICURSOR |
|
|
char[7] |
OCCI_SQLT_DAT |
|
|
Date |
OCCIDATE |
|
|
double |
OCCIDOUBLE |
|
|
float, double |
OCCIFLOAT |
|
|
float |
OCCIFLOAT |
|
|
int |
OCCIINT |
|
|
char[11] |
OCCI_SQLT_INTERVAL_DS |
|
|
char[5] |
OCCI_SQLT_INTERVAL_YM |
|
|
IntervalDS |
OCCIINTERVALDS |
|
|
IntervalYM |
OCCIINTERVALYM |
|
|
char[n] |
OCCI_SQLT_LNG |
|
|
unsigned char[n] |
OCCI_SQLT_LBI |
|
|
char[n+siezeof(integer)] |
OCCI_SQLT_LVC |
|
|
unsigned char[n+siezeof(integer)] |
OCCI_SQLT_LVB |
|
|
MetaData |
OCCIMETADATA |
|
|
struct |
OCCI_SQLT_NTY |
|
|
double |
OCCIBDOUBLE |
|
|
Bdouble, double |
OCCIBDOUBLE |
|
|
float |
OCCIBFLOAT |
|
|
BFloat, float |
OCCIBFLOAT |
|
NULLで終了する |
char[n+1] |
OCCI_SQLT_STR |
|
|
unsigned char[21] |
OCCI_SQLT_NUM |
|
|
Number |
OCCINUMBER |
|
|
OTTユーティリティによって生成されたユーザー定義型 |
OCCIPOBJECT |
|
|
unsigned char[n] |
OCCI_SQLT_BIN |
|
|
OCIRef |
OCCI_SQLT_REF |
|
|
Ref |
OCCIREF |
|
|
RefAny |
OCCIREFANY |
|
|
OCIRowid |
OCCI_SQLT_RID |
|
|
Bytes |
OCCIROWID |
|
|
OCIRowid |
OCCI_SQLT_RDD |
|
|
STL string |
OCCISTRING |
|
|
char[11] |
OCCI_SQLT_TIMESTAMP |
|
|
Timestamp |
OCCITIMESTAMP |
|
|
char[7] |
OCCI_SQLT_TIMESTAMP_LTZ |
|
|
char[13] |
OCCI_SQLT_TIMESTAMP_TZ |
|
|
unsigned int |
OCCIUNSIGNED_INT |
|
|
unsigned int |
OCCIUNSIGNED_INT |
|
|
char[n+sizeof( short integer)] |
OCCI_SQLT_VCS |
|
|
char[n] |
OCCI_SQLT_CHR |
|
|
char[22] |
OCCI_SQLT_VNU |
|
|
unsigned char[n+sizeof( short integer)] |
OCCI_SQLT_VBI |
|
|
STL vector |
OCCIVECTOR |
|
この項には次のトピックが含まれます: 「外部データ型の説明」。
外部データ型の説明
BFILE
BFILE
外部データ型を使用すると、データベース・サーバーのファイル・システムにあるファイルに読取り専用バイト・ストリームによるアクセスが可能となります。BFILE
は、オペレーティング・システム・ファイル内のデータベース表領域外に格納されているバイナリ・データのラージ・オブジェクトです。このファイルでは、参照セマンティクスが使用されます。OracleサーバーからBFILE
にアクセスする場合は、基礎となるサーバーのオペレーティング・システムが、ストリームモードによるこれらのオペレーティング・システム・ファイルへのアクセスをサポートしている必要があります。
BDOUBLE
OCCIのBDouble
インタフェースは、システム固有のdouble型データ、およびbinary_double
型の列またはオブジェクト属性のNULL
情報をカプセル化します。AnyDataクラス、ResultSetクラス、およびStatementクラスのOCCIメソッド、およびこれらのクラス・オブジェクトをパラメータとして取るグローバル・メソッドは、BDOUBLE
データ型に対して次の定義を使用します。
例5-1 BDOUBLEデータ型の定義
struct BDouble { double value; bool isNull; BDouble() { isNull = false; value = 0.; } };
BFLOAT
OCCIのBFloat
インタフェースは、システム固有のfloat型データ、およびbinary_float
型の列またはオブジェクト属性のNULL
情報をカプセル化します。AnyDataクラス、ResultSetクラス、およびStatementクラスのOCCIメソッド、およびこれらのクラス・オブジェクトをパラメータとして取るグローバル・メソッドは、BFLOAT
データ型に対して次の定義を使用します。
例5-2 BFLOATデータ型の定義
struct BFloat { float value; bool isNull; BFloat() { isNull = false; value = 0.; } };
BLOB
BLOB
外部データ型には、非構造化バイナリ・ラージ・オブジェクトが格納されます。BLOB
は、キャラクタ・セットのセマンティクスを伴わないビットストリームとみなすこともできます。BLOB
には、最大4
GBのバイナリ・データを格納できます。
BLOB
データ型には、完全なトランザクション・サポートがあります。OCCIを使用して行われた変更は、すべてトランザクションに反映されます。BLOB
値に対して行った操作は、コミットまたはロールバックできます。1つのトランザクション内で変数のBLOB
ロケータを保存し、次にそれを別のトランザクションまたはセッションで使用することはできません。
CHARZ
CHARZ
外部データ型は、入力時に文字列がNULL
文字で終了していること、および出力時にOracleによって文字列の最後にNULL
終端文字が配置されることを除けば、CHAR
データ型と同じです。NULL
終了文字列は入出力時に文字列を区切るためのものです。表のデータの一部ではありません。
CLOB
CLOB
外部データ型には、固定幅または可変幅の文字データが格納されます。CLOB
には、最大4
GBの文字データを格納できます。CLOB
には、完全なトランザクション・サポートがあります。OCCIを使用して行われた変更は、すべてトランザクションに反映されます。CLOB
値に対して行った操作は、コミットまたはロールバックできます。1つのトランザクション内で変数のCLOB
ロケータを保存し、次にそれを別のトランザクションまたはセッションで使用することはできません。
DATE
DATE
外部データ型は、表5-3に示すように、7バイトで構成されたOracle内部日付2進形式を使用して、日付の値の更新、挿入または取出しができます。
表5-3 DATEデータ型の書式
例 | バイト1: 世紀 | バイト2: 年 | バイト3: 月 | バイト4: 日 | バイト5: 時間 | バイト6: 分 | バイト7: 秒 |
---|---|---|---|---|---|---|---|
1: 01-JUN-2000, 3:17PM |
120 |
100 |
6 |
1 |
16 |
18 |
1 |
2: 01-JAN-4712 BCE |
53 |
88 |
1 |
1 |
1 |
1 |
1 |
例1: 2000年6月1日午後3時17分
-
世紀と年を表すバイト(1と2)は、
100
を加算した表記です。BCE (西暦紀元前)の日付は99
以下です。西暦0以降の日付は100
以上になります。0以降の日付の場合、バイト1とバイト2の先頭の数字は、西暦であることを示します。 -
バイト1では、世紀の2番目と3番目の数字は、年(整数)を100で除算して計算されます。整数除算による小数部分は切り捨てられます。1992年については、
1992 / 100 = 19
という計算が行われます。 -
バイト1の場合、
119
は、20世紀(1900から1999)を表します。120
の値は、21世紀(2000から2099)を表すことになります。 -
バイト2では、年の2番目と3番目の数字が年のモジュロ100として、
1992 % 100 = 92
のように計算されます。 -
バイト2の場合、
192
は、現在の世紀の92番目の年を表します。100
の値は、現在の世紀の0番目の年を表すことになります。 -
西暦2000年は、バイト1が
120
、バイト2が100
で表されます。 -
バイト3から7では、有効な日付はその年の1月1日から開始します。月バイトの範囲は
1
から12
、日付バイトの範囲は1
から31
、時間バイトの範囲は1
から24
、分バイトの範囲は1
から60
、秒バイトの範囲は1
から60
となります。
例2: BCE 4712年1月1日
-
西暦0以前の年数の場合、世紀数と年数は、100とその年数との差異で表されます。
-
バイト1では、BCE 4712年1月1日は
53
世紀(100 - 47 = 53
)になります。 -
バイト2では、BCE 4712年1月1日は
88
年(100 - 12 = 88
)になります。
日付に時刻が指定されていない場合、時刻はデフォルトで深夜となり、バイト5から6は1
(1
、1
、1
)に設定されます。
DATE
外部データ型を使用して、日付を2進形式で入力する場合、データベースでは一貫性または範囲のチェックが行われません。この形式によるデータは、入力前にすべて検証する必要があります。
DATE
外部データ型が必要となることはほとんどありません。ほとんどのプログラムでは、DD-MON-YYYY
などの文字形式で日付が処理されるため、DATE
の値を文字形式に変換する方が便利です。かわりに、Date
データ型を使用できます。
DATE
の列がプログラム内で文字列に変換されると、その列は使用中セッションのデフォルトの書式マスクで戻されるか、またはINIT.ORA
ファイルで指定したとおりに戻されます。
このデータ型は、C++のDate
データ型に対応するOCCI DATE
とは異なります。
FLOAT
FLOAT
外部データ型は、小数部分のある数値を処理します。数値はホスト・システムの浮動小数点書式で表されます。通常、長さは4バイトか8バイトです。
Oracleの数値の内部形式は10進数です。ほとんどの浮動小数点は2進数です。したがって、Oracleでは、浮動小数点による表現より高い精度で数値が表されます。
INTEGER
INTEGER
外部データ型は、数値の変換に使用されます。外部INTEGERは符号付きの2進数です。サイズは、オペレーティング・システムによって異なります。Oracleから戻される数値が整数でない場合は、小数部分が切り捨てられ、エラーは戻りません。戻された数値がシステムの符号付き整数より大きくて表現できない場合は、変換時のオーバーフロー・エラーが戻されます。
FLOAT
とNUMBER
間の変換時に、丸めのエラーが発生する場合があります。問合せでFLOAT
をバインド変数として使用すると、エラーが戻る場合があります。この問題を回避するには、FLOAT
を文字列に変換し、操作では、OCCI型のOCCI_SQLT_CHR
またはOCCI型のOCCI_SQLT_STR
を使用します。
INTERVAL DAY TO SECOND
INTERVAL
DAY
TO
SECOND
外部データ型には、日数、時間数、分数および秒数に関して、2つの日時の値の差異が格納されます。このデータ型は次のように指定します。
INTERVAL DAY [(day_precision)] TO SECOND [(fractional_seconds_precision)]
この例では、次のプレースホルダが使用されています。
-
day_precision
:DAY
日時フィールドの桁数。有効な値は、1
から9
です。デフォルト値は2
です。 -
fractional_seconds_precision
:SECOND
日時フィールドの小数部分の桁数。有効な値は、0
から9
です。デフォルト値は6
です。
INTERVAL
DAY
TO
SECOND
リテラルをデフォルト以外の日付と秒の精度で指定するには、このリテラル内に精度を指定する必要があります。たとえば、次のように、100
日、10
時間、20
分、42
秒と22
/100秒の間隔を指定できます。
INTERVAL '100 10:20:42.22' DAY(3) TO SECOND(2)
また、INTERVAL
DAY
TO
SECOND
リテラルの省略フォームも使用できます。たとえば、次のようにします。
-
INTERVAL '90' MINUTE
は、INTERVAL '00 00:90:00.00' DAY TO SECOND(2)
にマップされます。 -
INTERVAL '30:30' HOUR TO MINUTE
は、INTERVAL '00 30:30:00.00' DAY TO SECOND(2)
にマップされます。 -
INTERVAL '30' SECOND(2,2)
は、INTERVAL '00 00:00:30.00' DAY TO SECOND(2)
にマップされます。
INTERVAL YEAR TO MONTH
INTERVAL
YEAR
TO
MONTH
外部データ型には、YEAR
とMONTH
の日時フィールドを使用して、2つの日時の値の差異が格納されます。INTERVAL
YEAR
TO
MONTH
は、次のように指定します。
INTERVAL YEAR [(year_precision)] TO MONTH
プレースホルダyear_precision
は、YEAR
日時フィールドの桁数です。year_precision
のデフォルト値は2
です。INTERVAL
YEAR
TO
MONTH
リテラルをデフォルト以外のyear_precision
で指定するには、このリテラル内に精度を指定する必要があります。たとえば、次のINTERVAL
YEAR
TO
MONTH
リテラルは、123
年2
か月の間隔を示しています。
INTERVAL '123-2' YEAR(3) TO MONTH
また、INTERVAL
YEAR
TO
MONTH
リテラルの省略フォームも使用できます。次に例を示します。
-
INTERVAL '10' MONTH
は、INTERVAL '0-10' YEAR TO MONTH
にマップされます。 -
INTERVAL '123' YEAR(3)
は、INTERVAL '123-0' YEAR(3) TO MONTH
にマップされます。
LONG
LONG
外部データ型には、LONG
データ型の列に4001バイト以上、2
GBまでの文字列が格納されます。この型の列は、長い文字列の格納と取出しにのみ使用されます。メソッド、式またはWHERE
句では使用できません。一般的に、LONG
列値の変換は、文字列との間で行われます。
LONG VARCHAR
LONG VARCHAR
外部データ型には、OracleのLONG
列へのデータおよびこの列からのデータが格納されます。先頭の4バイトには、項目の長さが記述されます。LONG
VARCHAR
の最大長は2
GBです。
LONG VARRAW
LONG VARRAW
外部データ型には、OracleのLONG
RAW
列へのデータおよびこの列からのデータが格納されます。長さは、先頭の4バイトに記述されます。最大長は2
GBです。
NCLOB
NCLOB
外部データ型は、CLOB
の各国語キャラクタ・バージョンです。この外部データ型には、マルチバイトで固定幅の各国語キャラクタ・セットのキャラクタ(NCHAR
)または可変幅キャラクタ・セットのデータが格納されます。NCLOB
には、最大4GBの文字テキスト・データを格納できます。
NCLOB
には、完全なトランザクション・サポートがあります。OCCIを使用して行われた変更は、すべてトランザクションに反映されます。NCLOB
値に対して行った操作は、コミットまたはロールバックできます。1つのトランザクション内で変数にNCLOB
ロケータを保存し、次にそれを別のトランザクションまたはセッションで使用することはできません。
NCLOB
属性を指定してオブジェクトを作成することはできませんが、メソッドでNCLOB
パラメータを指定することは可能です。
NUMBER
NUMBER
を外部データ型として使用する必要はほとんどありません。これを使用すると、Oracleでは21
バイトの内部2進形式で数値を戻し、入力時にこの形式が必要になります。完全な情報が必要な場合は、次の説明を参照してください。
Oracleでは、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
に対する仮数は、101-5 = 96
となります。負数には、102
が含まれているバイトがデータ・バイトの後に追加されます。ただし、20
個の仮数バイトを持つ負数には、102
のバイトは後続しません。仮数バイトは基本100
であるため、各バイトは2桁の10進数値を表すことができます。仮数は正規化され、先行する0 (ゼロ)は格納されません。
仮数を表すために最大20
個のデータ・バイトを使用できます。ただし、精度が保証されているのは19
個のみです。19
個のデータ・バイトは、それぞれ基本100
を表し、NUMBER
内部データ型に対して38
桁の最大精度を提供します。
このデータ型は、C++のNumber
データ型に対応するOCCI NUMBER
とは異なります。
OCCI VECTOR
OCCI VECTOR
外部データ型は、ネストした表やVARRAY
などのコレクションを表すために使用されます。CREATE TYPE num_type as VARRAY OF NUMBER(10)
は、C++アプリケーションではvector<int>
、vector<Number>
として表すことができます。
RAW
RAW
外部データ型は、Oracleで解釈または処理されないバイナリ・データやバイト列で使用されます。たとえば、RAW
は図形の文字列で使用できます。RAW
列の最大長は2000バイトです。init.ora
のパラメータがmax_string_size = standard
(デフォルト値)の場合、RAW
の最大の長さは2000バイトです。init.ora
のパラメータがmax_string_size = extended
の場合、RAW
の最大の長さは32767バイトです。拡張データ型の詳細は、『Oracle Databaseリファレンス』のinit.ora
のパラメータMAX_STRING_SIZEに関する項を参照してください。
Oracle表内のRAW
データが文字列に変換される場合、データは16進コードで表されます。RAW
データの各バイトは、それぞれの値を示す00からFFの範囲の2文字で表されます。RAW
を使用して文字列を入力する場合は、16進コードを使用する必要があります。
ROWID
ROWID
外部データ型は、データベース表内の特定の行を識別します。多くの場合、ROWID
は次の例にあるような文の発行による問合せで戻されます。
SELECT ROWID, var1, var2 FROM db;
戻されたROWID
は、後続のDELETE
文で使用できます。
UPDATE
操作でSELECT
を実行する場合は、ROWID
が暗黙的に戻されます。
STRING
STRING
外部データ型は、VARCHAR2
外部データ型(データ型コード1)のように動作します。ただし、STRING
外部データ型は、NULL
で終了する必要があります。
このデータ型は、C++ STL文字列データ型に対応するOCCI STRING
とは異なります。
TIMESTAMP
TIMESTAMP
外部データ型は、DATE
データ型の拡張機能です。DATE
データ型の年、月および日に加えて、時、分および秒の値を格納します。TIMESTAMP
データ型は次のように指定します。
TIMESTAMP [(fractional_seconds_precision)]
プレースホルダfractional_seconds_precision
では、必要に応じて、SECOND
日時フィールドの小数部分の桁数を0から9の範囲で指定します。デフォルトは6です。たとえば、次のようにTIMESTAMP(2)
をリテラルとして指定します。
TIMESTAMP '1997-01-31 09:26:50.10'
このデータ型は、OCCI TIMESTAMP
とは異なります。
TIMESTAMPWITHLOCALTIMEZONE
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
オフセットにかかわらず、同一であるとみなされます。
TIMESTAMPWITHTIMEZONE
TIMESTAMP
WITH
TIME
ZONE
外部データ型はTIMESTAMP
の改良型で、その値にタイム・ゾーン置換が含まれています。タイム・ゾーン置換は、現地時間とUTC (協定世界時、以前はグリニッジ標準時)との差異(時分による)です。TIMESTAMP
WITH
TIME
ZONE
データ型は、次のように指定します。
TIMESTAMP [(fractional_seconds_precision)] WITH TIME ZONE
プレースホルダfractional_seconds_precision
では、必要に応じて、SECOND日時フィールドの小数部分の桁数を0
から9
の範囲で指定します。デフォルト値は6
です。たとえば、次のようにTIMESTAMP(0)
WITH
TIME
ZONE
をリテラルとして指定します。
TIMESTAMP '1997-01-31 09:26:50+02.00'
UNSIGNED INT
UNSIGNED INT
外部データ型は、符号なし2進整数に対して使用されます。バイト単位のサイズは、オペレーティング・システムによって異なります。ワード内のバイトの順序は、ホスト・システムのアーキテクチャによって決まります。Oracleから出力される数値が整数でない場合は、小数部分が切り捨てられ、エラーは戻りません。戻される数値が、オペレーティング・システムの符号なし整数より大きくて表現できない場合は、変換時のオーバーフロー・エラーが戻されます。
VARCHAR2
VARCHAR2
外部データ型は、最大4000バイトの可変長文字列です。init.ora
のパラメータがmax_string_size = standard
(デフォルト値)の場合、VARCHAR2
の最大の長さは4000バイトです。init.ora
のパラメータがmax_string_size = extended
の場合、VARCHAR2
の最大の長さは32767バイトです。拡張データ型の詳細は、『Oracle Databaseリファレンス』のinit.ora
のパラメータMAX_STRING_SIZEに関する項を参照してください。
VARNUM
VARNUM
外部データ型は、最初のバイトに数値表現の長さが含まれることを除けば、NUMBER
外部データ型と同じです。この長さを示す値には、長さを記述するバイト自体は含まれません。最大長のVARNUM
に備えて、22バイトを確保してください。VARNUM
の値をデータベースに送信するときは、長さを記述するバイトを設定する必要があります。
表5-4 VARNUMの例
10進数 | 長さバイト | 指数バイト | 仮数バイト | 終了文字バイト |
---|---|---|---|---|
|
|
|
NA脚注1 |
NA |
|
|
|
|
NA |
|
|
|
|
|
|
|
|
|
NA |
|
|
|
|
|
|
|
|
|
NA |
|
|
|
|
NA |
脚注 1
NAは、該当なしを意味します。
VARRAW
VARRAW
外部データ型は、最初の2バイトにデータの長さを記述することを除けば、RAW
外部データ型と同じです。バインドまたは定義コールで指定する文字列の長さには、この2バイトが含まれている必要があります。したがって、送受信可能なVARRAW
文字列の最大長は、65535
バイトではなく、65533
バイトになります。これより長い文字列を変換する場合は、LONG
VARRAW
データ型を使用します。
NATIVE DOUBLE
この外部データ型には、IEEE 754規格の標準倍精度浮動小数点データ型が実装されています。これは、ホスト・システムのネイティブの浮動小数点形式で表されます。このデータ型はバイト互換性のある標準形式でOracle Serverに格納されますが、それにはデータ長バイトを含めて8バイト必要です。これはOracle NUMBER
の代替であり、NUMBER
に対して次のような利点を持っています。
-
格納に使用するバイト数が少なくて済みます。
-
RDBMSクライアントで使用されるデータ型と一致します。
-
科学計算で使用される様々な値をサポートします。
データ変換
表5-5は、サポートされている、Oracle内部データ型から外部データ型への変換、および外部データ型から列の内部表現への変換を示しています。
次の条件に注意してください。
-
データベースに格納されている
REF
は、出力時にOCCI_SQLT_REF
に変換されます。 -
OCCI_SQLT_REF
は、入力時にREF
の内部表現に変換されます。 -
データベースに格納されている名前付きデータ型は、出力時に
OCCI_SQLT_NTY
(アプリケーション内ではC構造体で表現されます)に変換されます。 -
OCCI_SQLT_NTY
(アプリケーション内ではC構造体で表現されます)は、入力時に、対応するデータ型の内部表現に変換されます。 -
LOBと
BFILE
は、OCCIアプリケーション内では記述子で表現されるため、入出力時の変換はありません。
表5-5に示したように、変換には次の数値コードがあります。
-
データ型は、入力時にはOracle
ROWID
形式である必要があります。出力時は、OracleROWID
形式で戻されます。 -
データ型は、入力時にはOracle
DATE
形式である必要があります。出力時は、Oracle DATE
形式で戻されます。 -
データ型は、入力時には16進フォーマットである必要があります。出力時は、16進フォーマットで戻されます。
-
データ型は、出力時には有効な数値を表している必要があります。
-
長さは2000文字以下であることが必要です。
-
データ型は、出力時には16進フォーマットで格納される必要があります。出力時は16進フォーマットです。
表5-5 外部データ型と内部データ型間のデータ変換
NA(2) | 内部データ型 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
外部データ型 | VARCHAR2 | NUMBER | LONG | ROWID | DATE | RAW | LONG RAW | CHAR | BFLOAT | BDOUBLE |
|
I/O |
I/O |
I/O |
I/O1 |
I/O2 |
I/O3 |
I3、5 |
I/O |
I/O |
I/O |
|
I/O |
I/O |
I/O |
I/O1 |
I/O2 |
I/O3 |
I3、5 |
I/O |
NA |
NA |
|
I/O |
NA |
I |
NA |
I/O |
NA |
NA |
I/O |
NA |
NA |
|
I/O4 |
I/O |
I |
NA |
NA |
NA |
NA |
I/O4 |
NA |
NA |
|
I/O4 |
I/O |
I |
NA |
NA |
NA |
NA |
I/O4 |
I/O |
I/O |
|
I/O4 |
I/O |
I |
NA |
NA |
NA |
NA |
I/O4 |
I/O |
I/O |
|
I/O |
I/O |
I/O |
I/O1 |
I/O2 |
I/O3 |
I/O3、5 |
I/O |
I/O |
II/O |
|
O6 |
NA |
I5、6 |
NA |
NA |
I/O |
I/O |
O6 |
NA |
NA |
|
I/O |
I/O |
I/O |
I/O1 |
I/O2 |
I/O3 |
I/O3、5 |
I/O |
I/O |
I/O |
|
I/O6 |
NA |
I5、6 |
NA |
NA |
I/O |
I/O |
I/O6 |
NA |
NA |
|
I/O4 |
I/O |
I |
NA |
NA |
NA |
NA |
I/O4 |
I/O |
I/O |
OCCI BDouble |
I/O |
1/O |
I |
NA |
NA |
NA |
NA |
I/O |
I/O |
I/O |
OCCI BFloat |
I/O |
1/O |
I |
NA |
NA |
NA |
NA |
I/O |
I/O |
I/O |
|
I/O6 |
NA |
I5、6 |
NA |
NA |
I/O |
I/O |
I/O6 |
NA |
NA |
|
I/O脚注3 |
NA |
I |
NA |
I/O |
NA |
NA |
I/O |
NA |
NA |
|
I/O4 |
I/O |
I |
NA |
NA |
NA |
NA |
I/O4 |
I/O |
I/O |
|
NA |
NA |
NA |
NA |
NA |
NA |
NA |
NA |
NA |
NA |
|
I/O6 |
NA |
I5、6 |
NA |
NA |
I/O |
I/O |
I/O6 |
NA |
NA |
|
I |
NA |
I |
I/O |
NA |
NA |
NA |
[I] |
NA |
NA |
|
I/O |
I/O |
I/O |
I/O1 |
I/O2 |
I/O3 |
I/O3 |
- |
I/O4 |
I/O4 |
|
I/O |
I/O |
I/O |
I/O1 |
I/O2 |
I/O3 |
I/O3、5 |
I/O |
I/O |
I/O |
|
I/O4 |
I/O |
I |
NA |
NA |
NA |
NA |
I/O4 |
I/O |
I/O |
|
I/O |
I/O |
I/O |
I/O1 |
I/O2 |
I/O3 |
I/O3 |
NA |
I/O |
I/O |
|
I/O |
I/O |
I/O |
I/O1 |
I/O2 |
I/O3 |
I/O3、5 |
I/O |
I/O |
I/O |
|
I/O4 |
I/O |
I |
NA |
NA |
NA |
NA |
I/O4 |
I/O |
I/O |
|
I/O6 |
NA |
I5、6 |
NA |
NA |
I/O |
I/O |
I/O6 |
NA |
NA |
脚注 2 NAは、該当なしを意味します。
脚注 3
I/O = 他に指定されている場合を除き、変換は入力および出力に対して有効です。
LOBデータ型のデータ変換
表5-6 LOBのデータ変換
外部データ型 | 内部データ型 | |
---|---|---|
CLOB | BLOB | |
|
I/O脚注4 |
NA脚注5 |
|
I/O |
NA |
|
I/O |
NA |
|
I/O |
NA |
|
I/O |
NA |
|
NA |
I/O |
|
NA |
I/O |
|
NA |
I/O |
|
NA |
I/O |
|
NA |
I/O |
脚注 4
I/O = 変換は入力および出力に対して有効です。
脚注 5
NAは、該当なしを意味します。
関連項目:
LOB
データ型の概要については、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください。
日付、タイムスタンプおよび間隔データ型のデータ変換
文字データ型を、日時列または間隔列のフェッチ操作または挿入操作で使用するホスト変数に対して使用することもできます。Oracleでは、文字データ型と日時/間隔データ型との間の変換が行われます。
表5-7 日付、タイムスタンプおよび間隔データ型のデータ変換
外部型 | 内部型 | ||||||
---|---|---|---|---|---|---|---|
NA(6) | VARCHAR、CHAR | DATE | TS | TSTZ | TSLTZ | INTERVAL YEAR TO MONTH | INTERVAL DAY TO SECOND |
|
I/O脚注7 |
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 |
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 |
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 |
I/O |
NA |
|
I/O |
NA |
NA |
NA |
NA |
NA |
I/O |
|
I/O |
NA |
NA |
NA |
NA |
NA |
I/O |
脚注 6 NAは、該当なしを意味します。
脚注 7
I/O = 変換は入力および出力に対して有効です。
これらの変換は、日付、タイムスタンプおよび間隔データ型のデータ変換の場合に適用されます。
-
タイム・ゾーンがあるソースをタイム・ゾーンのないターゲットに割り当てると、ソースのタイム・ゾーン部分は無視されます。タイム・ゾーンのないソースをタイム・ゾーンがあるターゲットに割り当てると、ターゲットのタイム・ゾーンには、セッションのデフォルト・タイム・ゾーンが設定されます。
-
Oracle
DATE
をTIMESTAMP
に割り当てると、DATE
のTIME
部分がTIMESTAMP
にコピーされます。TIMESTAMP
をOracleDATE
に割り当てると、割当て後のDATE
のTIME
部分には0 (ゼロ)が設定されます。この0 (ゼロ)設定は、OracleDATE
からANSI
準拠のDATETIME
データ型への移行を容易にするために行われます。 -
(
ANSI
DATE
をOracleDATE
またはTIMESTAMP
に割り当てると、OracleDATE
のTIME
部分とTIMESTAMP
には0(ゼロ)が設定されます。OracleDATE
またはTIMESTAMP
をANSIDATE
に割り当てると、TIME
部分は無視されます。 -
DATETIME
を文字列に割り当てると、DATETIME
は、セッションのデフォルトのDATETIME
形式によって変換されます。文字列をDATETIME
に割り当てる場合は、その文字列にセッションのデフォルトのDATETIME
形式に基づく有効なDATETIME
値が含まれていることが必要です。 -
文字列を
INTERVAL
に割り当てる場合、その文字列が有効なINTERVAL
文字形式であることが必要です。 -
TSLTZ
からCHAR
、DATE
、TIMESTAMP
およびTSTZ
への変換時には、セッションのタイム・ゾーンに値が調整されます。 -
CHAR
、DATE
およびTIMESTAMP
からTSLTZ
への変換時には、そのセッションのタイム・ゾーンがメモリーに格納されます。 -
TSLTZ
をANSI
DATE
に割り当てると、時間部分が0
(ゼロ)になります。 -
TSTZ
からの変換時には、タイム・スタンプが存在しているタイム・ゾーンがメモリーに格納されます。 -
文字列を間隔に割り当てる場合、その文字列は有効な間隔の文字フォーマットである必要があります。