4.1.2 データ型の対応の設計

抽出処理で抽出側DBから抽出された更新データのデータ型は,抽出側Datareplicator Extensionによって反映側DBに反映できるデータ型に変換され,抽出情報キューファイルに格納されます。

このとき,抽出側DBから抽出されたデータは,まずHiRDBデータ型に変換されます。そして,HiRDBデータ型から反映側DBに合ったデータ型に変換されて,抽出情報キューファイルに格納されるという流れになります。

図4-1 データ型の変換

[図データ]

Datareplicator Extensionが対応している抽出側DBMSと反映側DBMSの組み合わせを次の表に示します。

表4-1 Datareplicator Extensionが対応している抽出側DBMSと反映側DBMSの組み合わせ

抽出側DB反映側DB
HiRDB(UNIX,Windows)Oracle(UNIX,Windows※2SQL 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のデータ型の対応
(2) 反映側DBのデータ型の対応

(1) 抽出側DBのデータ型の対応

ここでは,抽出側DBのデータ型とHiRDBデータ型との対応について説明します。

(a) Oracleデータ型からHiRDBデータ型への変換

Oracleからデータを抽出した場合,HiRDBデータ型には次の表のように変換されます。

抽出対象外のデータを抽出対象として抽出定義に指定した場合は,抽出定義プリプロセスファイルの作成処理でエラーとなります。

表4-2 Oracleから抽出するデータのデータ型対応

Oracleデータ型対応するHiRDBデータ型
データ属性データの長さ
VARCHAR2(n)1≦n≦4000MVARCHAR(n)
NVARCHAR2(n)1≦n≦4000NVARCHAR(n)
NUMBER(p,s)1≦p≦38
-84≦s≦127
SMALLINT,INTEGER,DECIMAL,又はFLOAT1
LONG抽出対象外
ROWID抽出対象外
DATE固定長の日付+時間データ。DATE,TIME,又はCHAR(19)2
RAW(n)1≦n≦2000BLOB(n)
LONG RAW抽出対象外
CHAR(n)1≦n≦2000MCHAR(n),DATE,又はTIME2
NCHAR(n)1≦n≦2000NCHAR(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≧pp≦4SMALLINT
5≦p≦9INTEGER
10≦p≦m[LARGE] DECIMAL(p)
m<pFLOAT
FLOAT(p)FLOAT
精度及び位取りを指定NUMBER(p,s)
DECIMAL(p,s)
NUMERIC(p,s)
m≧pp≧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<pFLOAT
(凡例)
-:依存しません。
m:抽出システム定義decimal_max_precisionオペランドの指定値です。省略した場合は,29が仮定されます。mの範囲は,29から38です。

注※2
どのデータ型で抽出するかは,抽出定義でユーザが指定します。
抽出定義の詳細については,「5.1.4 抽出定義」を参照してください。
(b) SQL Serverデータ型からHiRDBデータ型への変換

SQL Serverからデータを抽出した場合,HiRDBデータ型には次の表のように変換されます。

抽出対象外のデータを抽出対象として抽出定義に指定した場合は,抽出定義プリプロセスファイルの作成処理でエラーとなります。

表4-3 SQL Serverから抽出するデータのデータ型対応

SQL Serverデータ型対応するHiRDBデータ型
データ属性データの長さ
BIGINTLARGE DECIMAL(19,0)
p=19,s=0
INTINTEGER
SMALLINTSMALLINT
TINYINTSMALLINT
BITCHAR(1)
DECIMAL(p,s)0<p<m
0≦s≦p
  • p≦mの場合,LARGE DECIMAL(p,s)
    pとsは抽出対象表定義に指定したものと同じです。
  • p>mの場合,FLOAT
NUMERIC(p,s)
MONEYLARGE DECIMAL(19,4)
SMALLMONEYDECIMAL(10,4)
FLOATFLOAT
REALSMALLFLT
DATETIMEDATE,TIME,又はCHAR(19)※1
SMALLDATETIME
CHAR(n)CHAR(n)※1
VARCHAR(n)VARCHAR(n)
TEXT抽出対象外
NCHAR(n)※2NCHAR(n)
NVARCHAR(n)※2NVARCHAR(n)
NTEXT抽出対象外
BINARYBLOB,又はVARCHAR※1※3
VARBINARY
IMAGE抽出対象外
SQL_VARIANTVARCHAR(8000)
TIMESTAMP抽出対象外
UNIQUEIDENTIFIER
ユーザ定義データ型(ADT)ベースデータ型マッピングに従います。
(凡例)
m:抽出システム定義decimal_max_precisionオペランドの指定値です。省略した場合は,29が仮定されます。mの範囲は,29から38です。

注※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)」を参照してください。

 

表4-4 Oracleに反映するデータのデータ型対応

HiRDBデータ型対応するOracle
データ型
データ属性データの長さ
INTEGERデータ長については,マニュアル「HiRDB Version 9 SQLリファレンス」を参照してください。INTEGER(4)
SMALLINTINTEGER(2)
DECIMAL1CHAR
FLOATFLOAT(8)
SMALLFLT
CHAR※71≦n≦255CHAR(n)
MCHAR
NCHAR1≦n≦127CHAR(2n)
CHAR2※7n≧256LONG(n)
MCHAR2
NCHAR2n≧128LONG(2n)
VARCHAR3※71≦n≦4000VARCHAR2(n)
MVARCHAR3
NVARCHAR31≦n≦2000VARCHAR2(2n)
DATE4データ長については,マニュアル「HiRDB Version 9 SQLリファレンス」を参照してください。CHAR(10)
TIME4CHAR(8)
INTERVAL YEAR TO DATE5RAW(5)
INTERVAL HOUR TO SECOND5RAW(4)
BLOB61≦n≦2147483647​LONG RAW(n)
注1
データの長さのnは,データ長(バイト数)を表します。
ただし,NCHAR及びNVARCHARについては文字数を表します。
注2
反映対象表のデータ型は,Oracleの外部データ型を表します。
また,( )内はデータ長(バイト数)を表します。
注※1
OracleのC言語のOCIOracle 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ドライバを使用してデータ連動する場合の,抽出対象表と反映対象表のデータ型の対応を次の表に示します。

表4-5 ODBCを使用して反映するデータのデータ型の対応

HiRDBデータ型対応するODBCのデータ型
データ属性データの長さODBC SQLデータ型ODBC Cデータ型
INTEGERデータ長については,マニュアル「HiRDB Version 9 SQLリファレンス」を参照してください。SQL_INTEGERSQL_C_SLONG
SMALLINTSQL_SMALLINTSQL_C_SSHORT
DECIMAL1SQL_DECIMALSQL_C_CHAR
LARGE DECIMAL1
FLOATSQL_FLOATSQL_C_DOUBLE
SMALLFLTSQL_REALSQL_C_FLOAT
CHAR61≦n≦254SQL_CHARSQL_C_CHAR
MCHAR
NCHAR
CHAR6n≧255SQL_LONGVARCHARSQL_C_CHAR
MCHAR
NCHAR
VARCHAR6データ長については,マニュアル「HiRDB Version 9 SQLリファレンス」を参照してください。
LONG VARCHAR
MVARCHAR
LONG MVARCHAR
NVARCHAR
LONG NVARCHAR
DATE2SQL_DATESQL_C_DATE
TIME2SQL_TIME※5SQL_C_TIME※5
INTERVAL YEAR TO DATE3SQL_BINARY(5)SQL_C_BINARY
INTERVAL HOUR TO SECOND3SQL_BINARY(4)SQL_C_BINARY
BLOB4SQL_LONGVARBINARYSQL_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
文字集合指定をした列はデータ連動できません。指定した場合,ポートチェックエラーとなります。