この章には、Oracle C++ Call Interfaceアプリケーションで使用するOracleデータ型のリファレンスが記載されています。この情報は、アプリケーションとデータベース・サーバー間におけるデータ転送時に発生する、データの内部表現と外部表現との間の変換を理解するのに役立ちます。
ここでは、次の項目について説明します。
C++プログラムとOracleデータベース・サーバー間では、通信を正確に行うことが重要です。OCCIアプリケーションでは、SQL問合せを使用してデータベース表からデータを取り出すか、SQLのINSERT、UPDATEおよびDELETE関数を使用して既存のデータを変更できます。ホスト言語のC++とデータベース・サーバー間の通信を容易に行うには、C++データ型とOracleデータ型間の変換方法を理解する必要があります。
Oracleデータベースでは、値は表内の列に格納されています。Oracle内部では、データは内部データ型と呼ばれる特定フォーマットで表現されます。NUMBER、VARCHAR2およびDATEなどは、このOracle内部データ型の例です。
OCCIアプリケーションでは、ホスト言語データ型、またはホスト言語によって事前定義された外部データ型を使用します。データがOCCIアプリケーションとデータベース・サーバーの間で移動する際、データベースのデータは、内部データ型から外部データ型に変換されます。
OCCIでは、Typeと呼ばれる列挙子が定義されています。この列挙子には、OCCIアプリケーションで使用可能なデータの表現フォーマットがリストされています。この表現フォーマットは、外部データ型と呼ばれています。OCCIアプリケーションからデータベース・サーバーにデータを送信すると、外部データ型によって、そのデータのフォーマットがデータベース・サーバーに対して示されます。また、OCCIアプリケーションがデータベース・サーバーからデータを要求すると、外部データ型によって、戻されるデータのフォーマットが示されます。
たとえば、NUMBER列から値を取り出す場合は、その値をOCCIINTフォーマット(整変数への符号付き整数フォーマット)で取り出すようにプログラムを設定できます。あるいは、データをOCCIFLOATフォーマット(浮動小数点フォーマット)で送信するようにクライアントを設定できます。このフォーマットは、NUMBER型の列に挿入されるC++のfloat変数に格納されています。
OCCIアプリケーションでは、setxxx()メソッド(外部データ型はメソッド名によって暗黙的に指定されます)をコールするか、registerOutParam()、setDataBuffer()またはsetDataBufferArray()メソッド(外部データ型はメソッドのコールによって明示的に指定されます)をコールして、入力パラメータをStatementにバインドします。同様に、データ値がResultSetオブジェクトを使用してフェッチされた場合は、取り出したデータの外部表現を指定する必要があります。この指定は、getxxx()メソッド(外部データ型はメソッド名によって暗黙的に指定されます)をコールするか、setDataBuffer()メソッド(外部データ型はメソッドのコールによって明示的に指定されます)をコールして行います。
|
注意: 外部データ型は、内部データ型より多くあります。単一の外部データ型が単一の内部データ型にマップされる場合や、多数の外部データ型が単一の内部データ型にマップされる場合があります。この多対1のマッピングによって、柔軟性が向上します。 |
この項では、Oracleが提供する内部(組込み)データ型について説明します。説明、コード、最大サイズなど、Oracle内部データ型の概要は、表5-1を参照してください。
| 内部データ型 | 最大サイズ |
|---|---|
BFILE |
4GB |
BINARY_DOUBLE |
8バイト |
BINARY_FLOAT |
4バイト |
CHAR |
2000バイト |
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 |
2000バイト |
NUMBER |
21バイト |
NVARCHAR2 |
4000バイト |
RAW |
2000バイト |
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バイト |
文字またはバイト配列が含まれている列を指定するには、CHAR、VARCHAR2、RAW、LONGおよびLONG RAWの5つのOracle内部データ型を使用できます。
CHAR、VARCHAR2およびLONG列は、通常、文字データを保持します。RAWとLONG RAWは、ビットマップ化された画像のピクセル値など、文字として解釈されないバイトを保持します。文字データは、ネットワーク間のゲートウェイを介して渡すと、変形する可能性があります。たとえば、異なる言語(単一の文字が異なるバイト数で表現される)を使用しているマシン間で文字データを渡すと、データの長さが大幅に変更される可能性があります。RAWデータがこのように変換されることはありません。
適切なOracle内部データ型を表内の各列に対して選択するのは、データベース設計者の役割です。文字データとバイト配列データを表現する方法、およびOCCIプログラムの変数とOracleデータベース表間でデータを変換する方法には、様々な方法があることを理解しておく必要があります。
ユニバーサル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(LONG VARCHAR)
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ファイルのOCCIxxxフォーム(OCCIDOUBLE、OCCICURSORなど)のデータ型のみ使用できます。ただし、いくつか例外があります。OCCIANYDATA、OCCIMETADATA、OCCISTREAMおよびOCCIBOOLは使用できません。このメソッドで使用されるすべてのデータ型は、2つのアスタリスク(**)でマークされます。
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は、オペレーティング・システム・ファイル内のデータベース表領域外に格納されているバイナリ・データのラージ・オブジェクトです。このファイルでは、参照セマンティクスが使用されます。OracleサーバーからBFILEにアクセスする場合は、基礎となるサーバーのオペレーティング・システムが、ストリームモードによるこれらのオペレーティング・システム・ファイルへのアクセスをサポートしている必要があります。
OCCIのBDoubleインタフェースは、システム固有のdouble型データ、およびbinary_double型の列またはオブジェクト属性のNULL情報をカプセル化します。AnyDataクラス、ResultSetクラスおよびStatementクラスのOCCIメソッド、およびこれらのクラス・オブジェクトをパラメータとして取るグローバル・メソッドは、BDOUBLEデータ型に対して次の定義を使用します。
OCCIのBFloatインタフェースは、システム固有のfloat型データ、およびbinary_float型の列またはオブジェクト属性のNULL情報をカプセル化します。AnyDataクラス、ResultSetクラスおよびStatementクラスのOCCIメソッド、およびこれらのクラス・オブジェクトをパラメータとして取るグローバル・メソッドは、BFLOATデータ型に対して次の定義を使用します。
BLOB外部データ型には、非構造化バイナリ・ラージ・オブジェクトが格納されます。BLOBは、キャラクタ・セットのセマンティクスを伴わないビットストリームとみなすこともできます。BLOBには、最大4GBのバイナリ・データを格納できます。
BLOBデータ型には、完全なトランザクション・サポートがあります。OCCIを使用して行われた変更は、すべてトランザクションに反映されます。BLOB値に対して行った操作は、コミットまたはロールバックできます。1つのトランザクション内で変数のBLOBロケータを保存し、次にそれを別のトランザクションまたはセッションで使用することはできません。
CHARZ外部データ型は、入力時に文字列がNULLで終了し、出力時にOracleで文字列の最後にNULL終了文字列が配置されることを除けば、CHARデータ型と同じです。NULL終了文字列は入出力時に文字列を区切るためのものです。表のデータの一部ではありません。
CLOB外部データ型には、固定幅または可変幅の文字データが格納されます。CLOBには、最大4GBの文字データを格納できます。CLOBには、完全なトランザクション・サポートがあります。OCCIを使用して行われた変更は、すべてトランザクションに反映されます。CLOB値に対して行った操作は、コミットまたはロールバックできます。1つのトランザクション内で変数のCLOBロケータを保存し、次にそれを別のトランザクションまたはセッションで使用することはできません。
DATE外部データ型は、表5-3に示すように、7バイトで構成されたOracle内部日付2進形式を使用して、日付の値の更新、挿入または取出しができます。
表5-3 DATEデータ型の書式
| 例 | バイト1 世紀 |
バイト2 年 |
バイト3 月 |
バイト4 日 |
バイト5 時 |
バイト6 分 |
バイト7 秒 |
|---|---|---|---|---|---|---|---|
|
1: 2000年6月1日午後3時17分 |
120 |
100 |
6 |
1 |
16 |
18 |
1 |
|
2: BCE 4712年1月1日 |
53 |
88 |
1 |
1 |
1 |
1 |
1 |
世紀と年を表すバイト(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となります。
西暦0以前の年数の場合、世紀数と年数は、100とその年数との差異で表されます。
バイト1では、BCE 4712年1月1日は53世紀(100 - 47 = 53)になります。
バイト2では、BCE 4712年1月1日は88年(100 - 12 = 88)になります。
|
注意:
|
FLOAT外部データ型は、小数部分のある数値を処理します。数値は、ホスト・システムの浮動小数点フォーマットで表されます。通常、長さは4バイトか8バイトです。
Oracleの数値の内部形式は10進数です。ほとんどの浮動小数点は2進数です。したがって、Oracleでは、浮動小数点による表現より高い精度で数値が表されます。
INTEGER外部データ型は、数値の変換に使用されます。外部INTEGERは符号付きの2進数です。外部INTEGERのサイズは、オペレーティング・システムによって異なります。Oracleから戻される数値が整数でない場合は、小数部分が切り捨てられ、エラーは戻りません。戻された数値がシステムの符号付き整数より大きくて表現できない場合は、変換時のオーバーフロー・エラーが戻されます。
|
注意: FLOATとNUMBER間の変換時に、丸めのエラーが発生する場合があります。問合せでFLOATをバインド変数として使用すると、エラーが戻る場合があります。この問題を回避するには、FLOATを文字列に変換し、操作では、OCCI型のOCCI_SQLT_CHRまたはOCCI型のOCCI_SQLT_STRを使用します。 |
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外部データ型には、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データ型の列に4001バイト以上、2GBまでの文字列が格納されます。この型の列は、長い文字列の格納と取出しにのみ使用されます。メソッド、式またはWHERE句では使用できません。LONG列の値は、通常、文字列との間で変換されます。
LONG VARCHAR外部データ型には、OracleのLONG列へのデータおよびこの列からのデータが格納されます。先頭の4バイトには、項目の長さが記述されます。LONG VARCHARの最大長は2GBです。
LONG VARRAW外部データ型には、OracleのLONG RAW列へのデータおよびこの列からのデータが格納されます。長さは、先頭の4バイトに記述されます。最大長は2GBです。
NCLOB外部データ型は、CLOBの各国語キャラクタ・バージョンです。この外部データ型には、マルチバイトで固定幅の各国語キャラクタ・セットのキャラクタ(NCHAR)または可変幅キャラクタ・セットのデータが格納されます。NCLOBには、最大4GBの文字テキスト・データを格納できます。
NCLOBには、完全なトランザクション・サポートがあります。OCCIを使用して行われた変更は、すべてトランザクションに反映されます。NCLOB値に対して行った操作は、コミットまたはロールバックできます。1つのトランザクション内で変数のNCLOBロケータを保存し、次にそれを別のトランザクションまたはセッションで使用することはできません。
NCLOB属性を指定してオブジェクトを作成することはできませんが、メソッドでNCLOBパラメータを指定することは可能です。
NUMBERを外部データ型として使用する必要はほとんどありません。NUMBERを使用すると、Oracleでは21バイトの内部2進形式で数値を戻し、入力時にこの形式が必要になります。完全な情報が必要な場合は、次の説明を参照してください。
Oracleでは、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に対する仮数は、101-5 = 96となります。負数には、102が含まれているバイトがデータ・バイトの後に追加されます。ただし、20個の仮数バイトを持つ負数には、102のバイトは後続しません。仮数バイトは基本100であるため、各バイトは2桁の10進数値を表すことができます。仮数は正規化され、先行する0(ゼロ)は格納されません。
仮数を表すために最大20個のデータ・バイトを使用できます。ただし、精度が保証されているのは19個のみです。19個のデータ・バイトは、それぞれ基本100を表し、NUMBER内部データ型に対して38桁の最大精度を提供します。
このデータ型は、C++のNumberデータ型に対応するOCCI NUMBERとは異なります。
OCCI VECTOR外部データ型は、ネストした表やVARRAYなどのコレクションを表すために使用されます。CREATE TYPE num_type as VARRAY OF NUMBER(10)は、C++アプリケーションではvector<int>、vector<Number>として表すことができます。
RAW外部データ型は、Oracleで解釈または処理されないバイナリ・データやバイト列で使用されます。たとえば、RAWは図形の文字列で使用できます。RAW列の最大長は2000バイトです。
Oracle表内のRAWデータが文字列に変換される場合、データは16進コードで表されます。RAWデータの各バイトは、それぞれの値を示す00〜FFの範囲の2文字で表されます。RAWを使用して文字列を入力する場合は、16進コードを使用する必要があります。
ROWID外部データ型は、データベース表内の特定の行を識別します。多くの場合、ROWIDは次の例にあるような文の発行による問合せで戻されます。
SELECT ROWID, var1, var2 FROM db;
戻されたROWIDは、後続のDELETE文で使用できます。
UPDATE操作でSELECTを実行する場合は、ROWIDが暗黙的に戻されます。
STRING外部データ型は、VARCHAR2外部データ型(データ型コード1)のように動作します。ただし、STRING外部データ型は、NULLで終了する必要があります。
このデータ型は、C++ STL文字列データ型に対応するOCCI STRINGとは異なります。
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とは異なります。
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 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外部データ型は、符号なし2進整数に対して使用されます。バイト単位のサイズは、オペレーティング・システムによって異なります。ワード内のバイトの順序は、ホスト・システムのアーキテクチャによって決まります。Oracleから出力される数値が整数でない場合は、小数部分が切り捨てられ、エラーは戻りません。戻される数値が、オペレーティング・システムの符号なし整数より大きくて表現できない場合は、変換時のオーバーフロー・エラーが戻されます。
VARCHAR外部データ型には、可変長の文字列が格納されます。先頭の2バイトには文字列の長さが記述され、残りのバイトには実際の文字列が含まれます。バインドまたは定義コールで指定する文字列の長さには、この2バイトを含める必要があるため、VARCHAR文字列の最大長は、65535バイトではなく、65533バイトになります。これより長い文字列を変換する場合は、LONG VARCHAR外部データ型を使用します。
VARNUM外部データ型は、最初のバイトに数値表現の長さが含まれることを除けば、NUMBER外部データ型と同じです。この長さを示す値には、長さを記述するバイト自体は含まれません。最大長のVARNUMに備えて、22バイトを確保してください。VARNUMの値をデータベースに送信するときは、長さを記述するバイトを設定する必要があります。
VARRAW外部データ型は、最初の2バイトにデータの長さを記述することを除けば、RAW外部データ型と同じです。バインドまたは定義コールで指定する文字列の長さには、この2バイトが含まれている必要があります。したがって、送受信可能なVARRAW文字列の最大長は、65535バイトではなく、65533バイトになります。これより長い文字列を変換する場合は、LONG VARRAWデータ型を使用します。
この外部データ型は、IEEE754標準の倍精度浮動小数点データ型を実装します。数値は、ホスト・システム固有の浮動小数点フォーマットで表されます。データ型は、バイトと同等の標準フォーマットでOracleサーバーに格納されます。格納するには、長さを記述するバイトを含む8バイトが必要です。これは、Oracle NUMBERの代替として使用でき、NUMBERに比べて次の利点があります。
格納に使用するバイト数が少なくて済みます。
RDBMSクライアントで使用されるデータ型と一致します。
科学計算で使用される様々な値をサポートします。
この外部データ型は、IEEE754の単精度浮動小数点データ型を実装します。数値は、ホスト・システム固有の浮動小数点フォーマットで表されます。データ型は、バイトと同等の標準フォーマットでOracleサーバーに格納されます。格納するためには、長さを記述するバイトを含む4バイトが必要です。これは、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アプリケーション内では記述子で表現されるため、入出力時の変換はありません。
| 内部データ型 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 外部データ型 | 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 |
- |
- |
|
|
I/O |
- |
I |
- |
I/O |
- |
- |
I/O |
- |
- |
|
|
I/O4 |
I/O |
I |
- |
- |
- |
- |
I/O4 |
- |
- |
|
|
I/O4 |
I/O |
I |
- |
- |
- |
- |
I/O4 |
I/O |
I/O |
|
|
I/O4 |
I/O |
I |
- |
- |
- |
- |
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 |
I/O |
|
|
O6 |
- |
I5、6 |
- |
- |
I/O |
I/O |
O6 |
- |
- |
|
|
I/O |
I/O |
I/O |
I/O1 |
I/O2 |
I/O3 |
I/O3、5 |
I/O |
I/O |
I/O |
|
|
I/O6 |
- |
I5、6 |
- |
- |
I/O |
I/O |
I/O6 |
- |
- |
|
|
I/O4 |
I/O |
I |
- |
- |
- |
- |
I/O4 |
I/O |
I/O |
OCCI BDouble |
I/O |
I/O |
I |
- |
- |
- |
- |
I/O |
I/O |
I/O |
OCCI BFloat |
I/O |
I/O |
I |
- |
- |
- |
- |
I/O |
I/O |
I/O |
|
|
I/O6 |
- |
I5、6 |
- |
- |
I/O |
I/O |
I/O6 |
- |
- |
|
|
I/O |
- |
I |
- |
I/O |
- |
- |
I/O |
- |
- |
|
|
I/O4 |
I/O |
I |
- |
- |
- |
- |
I/O4 |
I/O |
I/O |
|
|
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
|
|
I/O6 |
- |
I5、6 |
- |
- |
I/O |
I/O |
I/O6 |
- |
- |
|
|
I |
- |
I |
I/O |
- |
- |
- |
I |
- |
- |
|
|
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 |
- |
- |
- |
- |
I/O4 |
I/O |
I/O |
|
|
I/O |
I/O |
I/O |
I/O1 |
I/O2 |
I/O3 |
I/O3 |
- |
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 |
- |
- |
- |
- |
I/O4 |
I/O |
I/O |
|
|
I/O6 |
- |
I5、6 |
- |
- |
I/O |
I/O |
I/O6 |
- |
- |
|
注意: I(入力時のみ)、O(出力時のみ)、I/O(入力時または出力時)に有効な変換
|
文字データ型のいずれかを、日時列または間隔列のフェッチ操作または挿入操作で使用するホスト変数に対して使用することもできます。Oracleでは、文字データ型と日時/間隔データ型との間の変換が行われます。
表5-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 |
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文字形式であることが必要です。
TSLTZからCHAR、DATE、TIMESTAMPおよびTSTZへの変換時には、セッションのタイム・ゾーンに値が調整されます。
CHAR、DATEおよびTIMESTAMPからTSLTZへの変換時には、そのセッションのタイム・ゾーンがメモリーに格納されます。
TSLTZをANSI DATEに割り当てると、時間部分が0(ゼロ)になります。
TSTZからの変換時には、タイム・スタンプが存在しているタイム・ゾーンがメモリーに格納されます。
文字列を間隔に割り当てる場合、その文字列は有効な間隔の文字フォーマットである必要があります。