この章には、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アプリケーションでは、set
xxx
()
メソッド(外部データ型
はメソッド名によって暗黙的に指定されます)をコールするか、registerOutParam()
、setDataBuffer()
またはsetDataBufferArray()
メソッド(外部データ型はメソッドのコールによって明示的に指定されます)をコールして、入力パラメータをStatement
にバインドします。同様に、データ値がResultSet
オブジェクトを使用してフェッチされた場合は、取り出したデータの外部表現を指定する必要があります。この指定は、get
xxx
()
メソッド(外部データ型
はメソッド名によって暗黙的に指定されます)をコールするか、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
ファイルのOCCI
xxx
フォーム(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
には、最大4
GBのバイナリ・データを格納できます。
BLOB
データ型には、完全なトランザクション・サポートがあります。OCCIを使用して行われた変更は、すべてトランザクションに反映されます。BLOB
値に対して行った操作は、コミットまたはロールバックできます。1つのトランザクション内で変数のBLOB
ロケータを保存し、次にそれを別のトランザクションまたはセッションで使用することはできません。
CHARZ
外部データ型は、入力時に文字列がNULL
で終了し、出力時にOracleで文字列の最後にNULL
終了文字列が配置されることを除けば、CHAR
データ型と同じです。NULL
終了文字列は入出力時に文字列を区切るためのものです。表のデータの一部ではありません。
CLOB
外部データ型には、固定幅または可変幅の文字データが格納されます。CLOB
には、最大4
GBの文字データを格納できます。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バイト以上、2
GBまでの文字列が格納されます。この型の列は、長い文字列の格納と取出しにのみ使用されます。メソッド、式またはWHERE
句では使用できません。LONG
列の値は、通常、文字列との間で変換されます。
LONG VARCHAR
外部データ型には、OracleのLONG
列へのデータおよびこの列からのデータが格納されます。先頭の4バイトには、項目の長さが記述されます。LONG
VARCHAR
の最大長は2
GBです。
LONG VARRAW
外部データ型には、OracleのLONG
RAW
列へのデータおよびこの列からのデータが格納されます。長さは、先頭の4バイトに記述されます。最大長は2
GBです。
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
からの変換時には、タイム・スタンプが存在しているタイム・ゾーンがメモリーに格納されます。
文字列を間隔に割り当てる場合、その文字列は有効な間隔の文字フォーマットである必要があります。