4.1.2 データ型の対応の設計
抽出処理で抽出側DBから抽出された更新データのデータ型は,抽出側Datareplicator Extensionによって反映側DBに反映できるデータ型に変換され,抽出情報キューファイルに格納されます。
このとき,抽出側DBから抽出されたデータは,まずHiRDBデータ型に変換されます。そして,HiRDBデータ型から反映側DBに合ったデータ型に変換されて,抽出情報キューファイルに格納されるという流れになります。
Datareplicator Extensionが対応している抽出側DBMSと反映側DBMSの組み合わせを次の表に示します。
抽出側DB |
反映側DB |
||
---|---|---|---|
HiRDB(UNIX,Windows) |
Oracle(UNIX,Windows※2) |
SQL Server(Windows) |
|
HiRDB(UNIX,Windows) |
○※1 |
○ |
○ |
Oracle(UNIX,Windows) |
○ |
× |
× |
SQL Server(Windows) |
○ |
× |
× |
- (凡例)
-
○:データ連動可能
×:データ連動不可
- 注※1
-
Datareplicator Extensionは不要です。
- 注※2
-
データ連動にODBCを使用します。
以降では,各DBMSのデータ型とHiRDBデータ型との対応について説明します。抽出側DBで使用するデータ型が反映側でどのデータ型に変換されるかは,「(1)抽出側DBのデータ型の対応」及び「(2)反映側DBのデータ型の対応」を比較して調べてください。
- 〈この項の構成〉
(1) 抽出側DBのデータ型の対応
ここでは,抽出側DBのデータ型とHiRDBデータ型との対応について説明します。
(a) Oracleデータ型からHiRDBデータ型への変換
Oracleからデータを抽出した場合,HiRDBデータ型には次の表のように変換されます。
抽出対象外のデータを抽出対象として抽出定義に指定した場合は,抽出定義プリプロセスファイルの作成処理でエラーとなります。
Oracleデータ型 |
対応するHiRDBデータ型 |
|
---|---|---|
データ属性 |
データの長さ |
|
VARCHAR2(n) |
1≦n≦4000 |
MVARCHAR(n) |
NVARCHAR2(n) |
1≦n≦4000 |
NVARCHAR(n) |
NUMBER(p,s) |
1≦p≦38 −84≦s≦127 |
SMALLINT,INTEGER,DECIMAL,又はFLOAT※1 |
LONG |
− |
抽出対象外 |
ROWID |
− |
抽出対象外 |
DATE |
固定長の日付+時間データ。 |
DATE,TIME,又はCHAR(19)※2 |
RAW(n) |
1≦n≦2000 |
BLOB(n) |
LONG RAW |
− |
抽出対象外 |
CHAR(n) |
1≦n≦2000 |
MCHAR(n),DATE,又はTIME※2 |
NCHAR(n) |
1≦n≦2000 |
NCHAR(n) |
CLOB |
− |
抽出対象外 |
NCLOB |
− |
抽出対象外 |
BLOB |
− |
抽出対象外 |
BFILE |
− |
抽出対象外 |
UROWID |
− |
抽出対象外 |
ユーザ定義型 |
− |
抽出対象外 |
- (凡例)
-
−:該当しません。
- 注1
-
抽出対象のデータのnは,データ長(バイト数)を表します。ただし,NCHAR及びNVARCHARについては文字数を表します。
また,pは精度,sは位取りを表します。
- 注2
-
反映対象表のデータ型のnは,データ長(バイト数)を表します。
ただし,NCHAR及びNVARCHARについては文字数を表します。
- 注※1
-
精度及び位取りを基に,次の表に従ってデータ型を決定します。
指定分類
Oracleのデータ
decimal_max_precisionオペランド指定値
条件
HiRDBデータ型
精度及び位取りの指定なし
NUMBER
REAL
DOUBLE PRECISION
−
なし
FLOAT
INTEGER
SMALLINT
DECIMAL
NUMERIC
−
なし
INTEGER
精度だけ指定
NUMBER(p)
DECIMAL(p)
NUMERIC(p)
m≧p
p≦4
SMALLINT
5≦p≦9
INTEGER
10≦p≦m
[LARGE] DECIMAL(p)
m<p
−
FLOAT
FLOAT(p)
−
−
FLOAT
精度及び位取りを指定
NUMBER(p,s)
DECIMAL(p,s)
NUMERIC(p,s)
m≧p
p≧m+1,
s≧m+1,
又はp−s≧m+1
FLOAT
p<s
かつp<m+1
かつs<m+1
かつp−s<m+1
[LARGE] DECIMAL(s,s)
s<0
かつp<m+1
かつp−s<m+1
[LARGE] DECIMAL(p−s,0)
上記以外
[LARGE] DECIMAL(p,s)
m<p
−
FLOAT
- 注※2
-
どのデータ型で抽出するかは,抽出定義でユーザが指定します。
抽出定義の詳細については,「5.1.4 抽出定義」を参照してください。
(b) SQL Serverデータ型からHiRDBデータ型への変換
SQL Serverからデータを抽出した場合,HiRDBデータ型には次の表のように変換されます。
抽出対象外のデータを抽出対象として抽出定義に指定した場合は,抽出定義プリプロセスファイルの作成処理でエラーとなります。
SQL Serverデータ型 |
対応するHiRDBデータ型 |
|
---|---|---|
データ属性 |
データの長さ |
|
BIGINT |
− |
LARGE DECIMAL(19,0) p=19,s=0 |
INT |
− |
INTEGER |
SMALLINT |
− |
SMALLINT |
TINYINT |
− |
SMALLINT |
BIT |
− |
CHAR(1) |
DECIMAL(p,s) |
0<p<m 0≦s≦p |
|
NUMERIC(p,s) |
||
MONEY |
− |
LARGE DECIMAL(19,4) |
SMALLMONEY |
− |
DECIMAL(10,4) |
FLOAT |
− |
FLOAT |
REAL |
− |
SMALLFLT |
DATETIME |
− |
DATE,TIME,又はCHAR(19)※1 |
SMALLDATETIME |
||
CHAR(n) |
− |
CHAR(n)※1 |
VARCHAR(n) |
− |
VARCHAR(n) |
TEXT |
− |
抽出対象外 |
NCHAR(n) |
−※2 |
NCHAR(n) |
NVARCHAR(n) |
−※2 |
NVARCHAR(n) |
NTEXT |
− |
抽出対象外 |
BINARY |
− |
BLOB,又はVARCHAR※1※3 |
VARBINARY |
||
IMAGE |
− |
抽出対象外 |
SQL_VARIANT |
− |
VARCHAR(8000) |
TIMESTAMP |
− |
抽出対象外 |
UNIQUEIDENTIFIER |
||
ユーザ定義データ型(ADT) |
− |
ベースデータ型マッピングに従います。 |
- 注※1
-
どのデータ型で抽出するかは,抽出定義でユーザが指定します。
抽出定義の詳細については,「5.2.4 抽出定義」を参照してください。
- 注※2
-
偶数長のシングルバイトデータ,又はマルチバイトデータである必要があります。
- 注※3
-
-
バイナリデータの最後の情報が「81」から「9F」までの場合,抽出情報キューファイルへの出力時点でこれらがNULL文字に変換されます。
-
BINARY又はVARBINARY以外のデータ型の列にバイナリデータを反映する場合,抽出情報キューファイルへの出力時点で「00」以降のデータは破棄されます。例えば,「0x006162630000」というデータをCHAR型の列に反映した場合,「0x000000…00」というデータになります。
-
(2) 反映側DBのデータ型の対応
ここでは,反映側DBのデータ型とHiRDBデータ型との対応について説明します。
(a) HiRDBデータ型からOracle(UNIX)データ型への変換
UNIX版Oracleのデータ型には,DB内部のデータ形式を表す内部データ型と,AP内のデータ形式を表す外部データ型があります。外部データ型は,内部データ型より種類が多く,OracleはAP内の外部データ型のデータを内部データ型の列へ変換する多種のデータ変換パターンを持っています。
Datareplicator Extensionは,HiRDBから抽出したデータをOracleの外部データ型へデータ変換してOracleのデータベースへ反映します。このため,反映対象表の作成時には,外部データ型から変換できる内部データ型を使用してください。
HiRDBからOracleへデータ連動する場合の,抽出対象表と反映対象表のデータ型の対応を次の表に示します。
- 注意事項
-
Windows版のOracleへの反映には,ODBCを使用します。「(b)HiRDBデータ型からODBCのデータ型への変換(SQL Server,Oracle)」を参照してください。
HiRDBデータ型 |
対応するOracle データ型 |
|
---|---|---|
データ属性 |
データの長さ |
|
INTEGER |
データ長については,マニュアル「HiRDB SQLリファレンス」を参照してください。 |
INTEGER(4) |
SMALLINT |
INTEGER(2) |
|
DECIMAL※1 |
CHAR |
|
FLOAT |
FLOAT(8) |
|
SMALLFLT |
||
CHAR※7 |
1≦n≦255 |
CHAR(n) |
MCHAR |
||
NCHAR |
1≦n≦127 |
CHAR(2n) |
CHAR※2※7 |
n≧256 |
LONG(n) |
MCHAR※2 |
||
NCHAR※2 |
n≧128 |
LONG(2n) |
VARCHAR※3※7 |
1≦n≦4000 |
VARCHAR2(n) |
MVARCHAR※3 |
||
NVARCHAR※3 |
1≦n≦2000 |
VARCHAR2(2n) |
DATE※4 |
データ長については,マニュアル「HiRDB SQLリファレンス」を参照してください。 |
CHAR(10) |
TIME※4 |
CHAR(8) |
|
INTERVAL YEAR TO DATE※5 |
RAW(5) |
|
INTERVAL HOUR TO SECOND※5 |
RAW(4) |
|
BLOB※6 |
1≦n≦2147483647 |
LONG RAW(n) |
- 注1
-
データの長さのnは,データ長(バイト数)を表します。
ただし,NCHAR及びNVARCHARについては文字数を表します。
- 注2
-
反映対象表のデータ型は,Oracleの外部データ型を表します。
また,( )内はデータ長(バイト数)を表します。
- 注※1
-
OracleのC言語のOCI(Oracle Call Interface)では,DECIMAL型のデータを扱えないので,数値文字列として文字型で反映します。なお,この場合のDECIMAL型の精度の最大値は38です。
数値文字列へ変換する場合は,符号を正規化します。符号の正規化手順を次に示します。
- 符号の正規化手順
X'A'→X'C' X'B'→X'D' X'C'→X'C' X'D'→X'D' X'E'→X'C' X'F'→X'F'
- 注※2
-
LONG型は探索条件に指定できません。
- 注※3
-
HiRDBには0バイトのデータを格納できますが,Oracleには0バイトのデータを格納できません。そのため,Datareplicatorでは反映先Oracleに対して0x00を格納します。
したがって,0バイトのデータを検索するためには,「0x00」を検索条件とする必要があります。このような検索差異を生じさせないために,Oracleへデータ連動する場合は,抽出側で0バイトのデータを扱わない運用をお勧めします。
- 注※4
-
TIME型はOracleに存在しないデータ型です。また,DATE型は,Oracleに存在するデータ型ですが,HiRDBとはデータ形式が異なり,日付及び時間の情報を持ちます。
Datareplicator Extensionでは,TIME型の抽出データをHH:MM:SS形式の文字列データとして,OracleのCHAR型で反映します。また,DATE型の抽出データをYYYY-MM-DD形式の文字列データとして,OracleのCHAR型で反映します。
ユーザは,TIME又はDATE型のどちらかのフォーマットをOracleの初期化パラメタNLS_DATE_FORMATに指定することで,抽出データをDATE型の列へ反映できます。その場合,内部的には列値にフォーマットされていない部分にOracleが仮定値を入れます(仮定値は,SQL実行日時によって変化します)。
Oracleは日付及び時間を含めた(システムの仮定値を含めた)条件判定をするため,Oracleが仮定値を入れた状態でその列をキー値とした条件検索を実行すると,条件が合わないことがあります。したがって,TIME及びDATE型のマッピングキーをDATE型の列へ反映しないでください。
- 注※5
-
バイナリデータとして反映します。
- 注※6
-
-
OracleのLONG RAW型への反映はできますが,OracleのBLOB型へは反映できません。
-
BLOB型を追加更新又は後方削除更新している場合は,データ連動しないでください。抽出側DBと反映側DBで不整合が発生します。
-
- 注※7
-
文字集合指定をした列はデータ連動できません。指定した場合,ポートチェックエラーとなります。
(b) HiRDBデータ型からODBCのデータ型への変換(SQL Server,Oracle)
ODBCドライバを使用してOracle又はSQL Serverへデータ連動する場合は,HiRDBデータ型をODBCのデータ型に変換してODBC関数を発行します。このため,反映対象表の作成時には,ODBCのデータ型から変換できるデータ型を使用してください。
HiRDBからODBCドライバを使用してデータ連動する場合の,抽出対象表と反映対象表のデータ型の対応を次の表に示します。
HiRDBデータ型 |
対応するODBCのデータ型 |
||
---|---|---|---|
データ属性 |
データの長さ |
ODBC SQLデータ型 |
ODBC Cデータ型 |
INTEGER |
データ長については,マニュアル「HiRDB SQLリファレンス」を参照してください。 |
SQL_INTEGER |
SQL_C_SLONG |
SMALLINT |
SQL_SMALLINT |
SQL_C_SSHORT |
|
DECIMAL※1 |
SQL_DECIMAL |
SQL_C_CHAR |
|
LARGE DECIMAL※1 |
|||
FLOAT |
SQL_FLOAT |
SQL_C_DOUBLE |
|
SMALLFLT |
SQL_REAL |
SQL_C_FLOAT |
|
CHAR※6 |
1≦n≦254 |
SQL_CHAR |
SQL_C_CHAR |
MCHAR |
|||
NCHAR |
|||
CHAR※6 |
n≧255 |
SQL_LONGVARCHAR |
SQL_C_CHAR |
MCHAR |
|||
NCHAR |
|||
VARCHAR※6 |
データ長については,マニュアル「HiRDB SQLリファレンス」を参照してください。 |
||
LONG VARCHAR |
|||
MVARCHAR |
|||
LONG MVARCHAR |
|||
NVARCHAR |
|||
LONG NVARCHAR |
|||
DATE※2 |
SQL_DATE |
SQL_C_DATE |
|
TIME※2 |
SQL_TIME※5 |
SQL_C_TIME※5 |
|
INTERVAL YEAR TO DATE※3 |
SQL_BINARY(5) |
SQL_C_BINARY |
|
INTERVAL HOUR TO SECOND※3 |
SQL_BINARY(4) |
SQL_C_BINARY |
|
BLOB※4 |
SQL_LONGVARBINARY |
SQL_C_BINARY |
- 注1
-
データの長さのnは,データ長(バイト数)を表します。
ただし,NCHARについては文字数を表します。
- 注2
-
反映対象表のデータ型の( )内は,データ長(バイト数)を表します。
- 注※1
-
HiRDBのDECIMAL型の精度は29けたまでですが,ODBCのSQL_DECIMAL型は15けたまでです。16けた以上のデータを反映したときの処理は,使用するODBCドライバの仕様に従います。
- 注※2
-
ODBCドライバがSQL Serverの場合は,DATE及びTIME型はSQL_CHARに変換されます。
- 注※3
-
バイナリデータとして反映します。
- 注※4
-
BLOB型を追加更新又は後方削除更新している場合は,データ連動しないでください。抽出側DBと反映側DBで不整合が発生します。
- 注※5
-
反映先がOracleの場合は,データ型をDate型にしてください。
- 注※6
-
文字集合指定をした列はデータ連動できません。指定した場合,ポートチェックエラーとなります。