データのマップおよび変換

ソース表とターゲット表の間のデータの統合に使用されるタスク、関数、コマンドおよびプロセスについて学習します。

マッピングおよびデータ統合を制御するパラメータ

Oracle GoldenGateで実行されるデータの選択、マッピングおよび操作は、すべてTABLEパラメータおよびMAPパラメータのオプションを1つ以上使用して行われます。

TABLEとMAPは、パラメータ・ファイル内の他のパラメータに影響を受けるデータベース・オブジェクトを指定します。これらのパラメータによるオブジェクト名指定の手順は、「Oracle GoldenGateの入力におけるオブジェクト名の指定」を参照してください。

異なるデータベース間のマッピング

異なるデータ構造を持つ表どうしのマッピングおよび変換には、ソース定義ファイルまたはターゲット定義ファイル、あるいは(一定の場合)その両方が必要です。異なるデータベース間のマッピングは、ソース列またはターゲット列のデータ型に関係なく、自己記述型の証跡によって制御され、マッピングは列名によって実行されます。

自己記述型の証跡に基づく自動マッピングを行わない場合、または下位互換性が必要な場合は、SOURCEDEFSまたはTARGETDEFSを使用します。

NonStopシステムでのマッピングおよび変換

WindowsシステムまたはUNIXシステムからNonStop Enscribeターゲットへのデータのマッピングまたは変換を行う場合、マッピングまたは変換はソースのWindowsシステムまたはUNIXシステムで実行する必要があります。NonStop用のReplicatは、3つまたは2つの部分からなるSQL表名およびデータ型を、Enscribeプラットフォームで使用される3つの部分からなるファイル名に変換できません。Extractは、証跡データをEnscribeの名前およびターゲット・データ型でフォーマットできます。

WindowsシステムとUNIXシステムでのマッピングおよび変換

Oracle GoldenGateがWindowsベースおよびUNIXベースのシステムでのみ動作している場合、列のマッピングおよび変換をExtractプロセスまたはReplicatプロセスで実行できます。Extractプロセスでこの処理に追加のオーバーヘッドが発生するのを防止するため、マッピングおよび変換がReplicatプロセスまたは中間システムで実行されるように構成できます。

複数のソースに対して1つのターゲットがある場合、状況によってはソースでマッピングと変換を実行すると効率が向上する場合があります。

データ・マッピング時のグローバリゼーションに関する考慮事項

データベースとプラットフォームの間のデータのマッピングおよび変換を計画する際には、グローバリゼーションに関してOracle GoldenGateでサポートされている処理とサポートされていない処理を考慮してください。

文字セット間の変換

Oracle GoldenGateでは、ソースとターゲットの文字セットが異なると、オブジェクト名および列データがデータベース間で正しく比較、マップ、操作されるようにするため、文字セットの変換が行われます。サポートされる文字セットのリストは、サポートされる文字セットを参照してください。

異なるデータベースの間で文字が正確に表現されるためには、次の条件を満たす必要があります。

この構成では、クライアントまたはソースの文字セットからローカル・データベースの文字セットへの変換時に、各文字が表現されます。

Replicatプロセスは、1つのソース文字セットから1つのターゲット文字セットへの変換をサポートできます。

データベース・オブジェクト名

Oracle GoldenGateでは、カタログ、スキーマ、表および列の名前は、ソース・データベースおよびターゲット・データベースの文字セット・エンコーディングに従って、ネイティブ言語で処理されます。このサポートにより、データベース階層のあらゆるレベルで、シングルバイトおよびマルチバイトの名前、記号、アクセント文字、大/小文字の区別が維持され、ロケールがあればそれも考慮されます。

列データ

Oracle GoldenGateでは、データが次のタイプの列に格納されている場合、文字セット間での列データの変換がサポートされます。

列データの文字セット変換は、ReplicatのMAPパラメータのCOLMAP句またはUSEDEFAULTS句のソース列とターゲット列との直接マッピングに限定されています。直接マッピングは、ストアド・プロシージャや列変換関数を使用しない、名前から名前へのマッピングです。Replicatは、文字セット変換を実行します。Extractでは変換は実行されません。

ロケールの維持

Oracle GoldenGateでは、大/小文字が区別されないオブジェクト名の比較時に、データベースのロケールが考慮されます。サポートされるロケールのリストは、サポートされるロケールを参照してください。

エスケープ・シーケンスのサポート

Oracle GoldenGateでは、パラメータ・ファイルで文字列の列、リテラル・テキストまたはオブジェクト名を表すためのエスケープ・シーケンスの使用がサポートされています。エスケープ・シーケンスは、オペレーティング・システムで必要な文字(制御文字など)がサポートされていない場合に、またはパラメータ・ファイルで使用できない文字が必要になるその他の目的のために使用できます。

エスケープ・シーケンスは、パラメータ・ファイルの任意の場所で使用できますが、TABLE文またはMAP文の次の要素で特に便利です。

Oracle GoldenGateでは、次のタイプのエスケープ・シーケンスがサポートされます。

次のルールが適用されます。

\uFFFF Unicodeエスケープ・シーケンスを使用するには

\u20acは、ユーロ通貨記号のUnicodeエスケープ・シーケンスです。

ノート:信頼できるクロス・プラットフォームのサポートのために、Unicodeエスケープ・シーケンスを使用してください。8進および16進のエスケープ・シーケンスは、異なるオペレーティング・システムでは標準化されていません。

\377 8進エスケープ・シーケンスを使用するには

\xFF 16進エフェスケープ・シーケンスを使用するには

\x80は、Microsoft Windows 1252 Latin1コード・ページのユーロ通貨記号を表す16進エスケープ・シーケンスです。

TABLEおよびMAPを使用した列のマッピング

Oracle GoldenGateでは、表レベルおよびグローバル・レベルの列マッピングが提供されます。明示的な列マッピング・ルールがない場合は、デフォルトの列マッピングも提供されます。

この項には、次のような列マッピング・ガイドラインがあります。

列名での大/小文字の区別および特殊文字のサポート

Oracle GoldenGateでの列名とリテラルの指定は、デフォルトで、SQL-92ルールに従います。大/小文字を区別するために二重引用符が必要になるデータベースの場合は、Oracle GoldenGateパラメータ・ファイル、変換関数、ユーザー・イグジットおよびコマンドにおいて、大/小文字を区別する列名を二重引用符で囲む必要があります。大/小文字を区別するために引用符が必要ないその他のデータベースの場合は、大/小文字が区別される列名を、データベースに格納されているとおりに指定する必要があります。リテラルを一重引用符で囲む必要があります。詳細は、大/小文字が区別される列名とリテラルの区別を参照してください。

COLMAPによる表レベルの列マッピングの構成

自己記述型の証跡を使用している場合、ソース・オブジェクトの列は、ターゲット・オブジェクトの同じ列名にマップされます。列名がソースとターゲット間で異なる場合、または列を変換する必要がある場合にのみ、列名を管理する必要があります。

ただし、自己記述型の証跡を使用していない場合、デフォルトのマッピングは列の順序によって行われ、列名では行われません。そのため、ソースの列1はターゲットの列1に、ソースの列2はターゲットの列2にマッピングされます。

MAPおよびTABLEパラメータのCOLMAPオプションを使用して、次の処理を実行します。

USEDEFAULTSを使用したデフォルトの列マッピングの有効化

COLMAPのUSEDEFAULTSオプションを使用すると、ソース列と対応するターゲット列の名前が同一の場合に、自動デフォルト列マッピングを指定できます。USEDEFAULTSを使用すると、すべてのターゲット列を明示的にマップする必要がないので、時間を節約できます。

デフォルト・マッピングの場合、Oracle GoldenGateはそれらの列をマッピングし、必要な場合は、データ型を、データ定義ファイルに基づいて変換します。明示的なマッピング文でマップされている列にはデフォルト・マッピングを指定しないでください。

次の列マッピングの例では、 ソース表ACCTBLとターゲット表ACCTTABのデフォルト列マッピングと明示的な列マッピングの使用について示します。両方の表の大半の列は同じで、次の点が異なります。

これらの相違点に対処するため、USEDEFAULTSを使用して同じ列を自動的にマップして、異なる列には明示マッピングおよび変換関数を使用します。

次のサンプルは、MAPパラメータとTABLEパラメータのCOLMAPオプションを使用した列マッピングを示しています。ソース表ACCTBLからターゲット表ACCTTABへのマッピングについて説明します。

MAP SALES.ACCTBL, TARGET SALES.ACCTTAB,
                COLMAP (   USEDEFAULTS,
                           NAME = CUST_NAME,
                           TRANSACTION_DATE = @DATE ('YYYY-MM-DD', 'YY',YEAR, 'MM', MONTH, 'DD', DAY),
                           AREA_CODE = @STREXT (PHONE_NO, 1, 3),
                           PHONE_PREFIX = @STREXT (PHONE_NO, 4, 6),
                           PHONE_NUMBER = @STREXT (PHONE_NO, 7, 10)
)
;

表3サンプルの列マッピング

パラメータ文 摘要
COLMAP COLMAP文を開始します。
USEDEFAULTS, ターゲット列の名前が同一の場合、ソース列をそのままマップします。
NAME = CUST_NAME, ソース列CUST_NAMEをターゲット列NAMEにマップします。
TRANSACTION_DATE = @DATE ('YYYY-MM-DD', 'YY', YEAR, 'MM', MONTH, 'DD', DAY), @DATE列変換関数を使用して、ソースの日付列からターゲット列TRANSACTION_DATEにトランザクション日付を変換します。
AREA_CODE = @STREXT (PHONE_NO, 1, 3), PHONE_PREFIX = @STREXT (PHONE_NO, 4, 6), PHONE_NUMBER = @STREXT (PHONE_NO, 7, 10)) ; @STREXT列変換関数を使用して、ソース列PHONE_NOを別々のターゲット列AREA_CODE、PHONE_PREFIXおよびPHONE_NUMBERに接続します。

デフォルトの列マッピングでOracle GoldenGateが従うルールの詳細は、「デフォルトの列マッピングの理解」を参照してください。

COLMAP句でマップされる列の指定

COLMAPの構文は次のとおりです。

COLMAP ([USEDEFAULTS, ] target_column = source_expression)

この構文でtarget_columnはターゲット列の名前とsource_expressionです。source_expressionsの例を次に示します。

列マッピングに、異なるデータベース・タイプに由来する、大/小文字が区別される複数の列が関係する場合、各列を、データベースに格納されているとおりに指定してください。

次は、Oracle AI Databaseのターゲット列と、大/小文字が区別するSQL Serverデータベースのソース列間のマッピングを示しています。

COLMAP ("ColA" = ColA)

Oracle GoldenGateへの名前の指定の詳細は、「Oracle GoldenGateの入力におけるオブジェクト名の指定」を参照してください。

文字セットとロケールが異なるデータベース間でソース列とターゲット列をマップする場合のグローバリゼーションに関する考慮事項については、「データ・マッピング時のグローバリゼーションに関する考慮事項」を参照してください。

COLMAPを使用してキー列に値をマップ(主キーの更新操作が発生)しないでください。Oracle GoldenGateがターゲット行の特定に使用するWHERE句では、キー列の正しい変更前イメージが使用されません。かわりに、変更後イメージが使用されます。このため、SQLEXEC文などのキー列に基づく関数を使用している場合、エラーになります。

列マッピングの制限

列マッピングの制限は次のとおりです。

COLMATCHによるグローバル列マッピングの構成

COLMATCHパラメータでは、列マッピングのグローバル・ルールを作成します。COLMATCHでは、同じデータセットに対して異なる列名を持つ類似した構造の表どうしをマップできます。このタイプの列をマップする場合、個別のTABLE文またはMAP文のCOLMAP句で表レベルのマッピングを使用するより、COLMATCHの方が簡単です。

大/小文字の区別は次のようにサポートされます。

構文

COLMATCH
{NAMES target_column = source_column |
PREFIX prefix |
SUFFIX suffix |
RESET}
引数 摘要
NAMES target_column = source_column 列名に基づいてマップします。列名で大/小文字が区別され、データベースで大/小文字が区別されるために引用符が必要な場合、列名を二重引用符で囲みます。これらのデータベース・タイプでは、Oracle GoldenGateは、引用符で囲まれていない列名を大/小文字の区別がされないものとして扱います。大/小文字の区別はサポートしているが引用符が必要ないデータベースの場合は、列名を、データベースに格納されているとおりに指定してください。COLMATCHがデータベース・タイプが異なる列に適用される場合は、それぞれの名前で大/小文字の区別が適切に表現されるようにしてください。たとえば、次の例は、Oracle AI Database内の大/小文字を区別するターゲット列名"aBc"と、大/小文字を区別するSQL Serverデータベース内の、大/小文字を区別するソース列名aBcを指定しています。COLMATCH NAMES "aBc" = aBc。
PREFIX prefix / SUFFIX suffix 指定した名前接頭辞または名前接尾辞を無視します。データベースで大/小文字が禁止されるために引用符が必要な場合、接頭辞または接尾辞を二重引用符で囲みます(たとえば、"P_")。それらのデータベース・タイプでは、引用符で囲まれていない接頭辞または接尾辞を大/小文字の区別がされないものとして扱います。大/小文字の区別がサポートされているが引用符が必要ないデータベースの場合は、接頭辞または接尾辞を、データベースに格納されているとおりに指定してください。たとえば、"P_"は、大文字の接頭辞Pを指定しました。次の例では、大/小文字が区別されない接頭辞を無視するよう指定しています: COLMATCH PREFIX p_。ターゲット列名P_ABCはソース列名ABCにマップされ、ターゲット列名P_abcはソース列名abcにマップされます。次の例では、大/小文字が区別されるSUFFIX "_k"を無視するよう指定しています。ターゲット列名ABC_kはソース列名ABCにマップされ、ターゲット列名"abc_k"はソース列名abcにマップされます。
RESET 後続のTABLE文またはMAP文に対して、以前に定義されたCOLMATCHルールを無効にする。

次の例は、COLMATCH. を使用するタイミングを示していますソースとターゲット表は、表と列names.Theデータベースがわずかに異なることを除いて同一です。データベースでは、大文字と小文字は区別されません。

ACCT表 ORD表
CUST_CODE CUST_NAME CUST_ADDR PHONE S_REP S_REPCODE CUST_CODE CUST_NAME ORDER_ID ORDER_AMT S_REP S_REPCODE
ACCOUNT表 ORDER表
CUSTOMER_CODE CUSTOMER_NAME CUSTOMER_ADDRESS PHONE REP REPCODE CUSTOMER_CODE CUSTOMER_NAME ORDER_ID ORDER_AMT REP REPCODE

この例でソース列をターゲット列にマップし、同時に他の表で後続のマップを処理するには、次の構文を使用します。

COLMATCH NAMES CUSTOMER_CODE = CUST_CODE
COLMATCH NAMES CUSTOMER_NAME = CUST_NAME
COLMATCH NAMES CUSTOMER_ADDRESS = CUST_ADDR
COLMATCH PREFIX S_
MAP SALES.ACCT, TARGET SALES.ACCOUNT, COLMAP (USEDEFAULTS);
MAP SALE.ORD, TARGET SALES.ORDER, COLMAP (USEDEFAULTS);
COLMATCH RESET
MAP SALES.REG, TARGET SALE.REG;
MAP SALES.PRICE, TARGET SALES.PRICE;

この例のルールに基づいて、次の処理が発生します。

デフォルトの列マッピングの理解

自己記述型の証跡ファイルについて、COLMATCHまたはCOLMAPを使用した明示的な列マッピングが存在しない場合、Oracle GoldenGateでは、デフォルトで次のルールに従ってソース列とターゲット列がマップされます。

これは、SOURCEDEFSまたはTARGETDEFSを使用している場合は適用されません。

デフォルトのマッピングを実行できない場合、ターゲット列は、デフォルトで次の表に示されているいずれかの値になります。

列タイプ 値
数値 ゼロ(0)
文字またはVARCHAR スペース
日付または日時 現在の日付と時刻
NULL値を使用できる列 Null

データ型の変換

Oracle GoldenGateによるデータ型のマップ方法について学習します。

数値カラム

数値の列は、ターゲット列の型およびスケールと一致するように変換されます。ターゲット列のスケールがソース列のスケールより小さい場合、数値の右側が切り捨てられます。ターゲット列のスケールがソースのスケールより大きい場合、数値の右側に0(ゼロ)が埋め込まれます。

詳細は、REPLACEBADNUMパラメータを使用することで、数字列をマッピングするときに検出する無効な数字データの代替値を指定できます。

文字型の列

文字型の列では、VARCHARなどの文字ベースのデータ型、文字列形式の数値、文字列形式の日時、および文字列リテラルを使用できます。ターゲット列のスケールがソースのスケールより小さい場合、列の右側が切り捨てられます。ターゲット列のスケールがソースのスケールより大きい場合、列の右側に空白が埋め込まれます。

リテラルを一重引用符で囲む必要があります。

REPLACEBADCHARパラメータを使用すると、文字の列をマッピングするときにソースまたはターゲットの文字セットに対して有効なコードポイントが存在しない場合、Oracle GoldenGateプロセスのレスポンスを制御できます。

日時カラム

日時(DATE、TIMEおよびTIMESTAMP)の列では、日時および文字の列に加え、文字列リテラルを使用できます。リテラルを一重引用符で囲む必要があります。文字列を日時列にマップするには、YYYY-MM-DD HH:MI:SS.FFFFFF.のOracle GoldenGate外部SQL形式に準拠していることを確認します。

Oracle GoldenGateでは、0001-01-03 00:00:00から9999-12-31 23:59:59までのタイムスタンプ・データがサポートされます。タイムスタンプがGMTからローカル時間に変換されると、これらの制限も結果のタイムスタンプに適用されます。タイムゾーンに応じて、変換によって時間が加算または減算される可能性があり、これにより、タイムスタンプがサポートされている上限を超えたり、下回ったりすることがあります。

必要な精度は、データ型およびターゲット・プラットフォームに応じて異なります。ターゲット列のスケールがソースのスケールのスケールより小さい場合、データの右側が切り捨てられます。ターゲット列のスケールがソースのスケールより大きい場合、列の右側が現在の日時の値で拡張されます。

行の選択とフィルタリング

フィルタリングはOracle GoldenGateで使用可能な列に対してのみ実行できます。TRANLOG Extractでは、Oracle GoldenGateは、REDOログおよびデータベース内に存在するすべての列にアクセスできます。列がREDOログにない場合は、その列を明示的にフェッチし(FETCHCOLSを使用)、それらをフィルタ処理できるようにする必要があります。ExtractポンプおよびReplicatでは、これらの列を証跡ファイル内で使用できる必要があります。このため、FILTER句またはWHERE句で使用する列は、ADD TRANDATA COLSを使用して明示的にログに記録する必要があり、デフォルトのLOGALLSUPCOLSを維持する必要があります。

抽出またはレプリケートする行をフィルタで除外または選択するには、TABLEおよびMAPパラメータのFILTER句およびWHERE句を使用します。

WHERE句では基本的なWHERE演算子を使用できますが、FILTER句では、Oracle GoldenGate列変換関数をすべて使用できるため、WHERE句より多くの機能が提供されます。

FILTER句を使用した行の選択

FILTER句を使用して、基本演算子または1つ以上のOracle GoldenGate列変換関数により、数値に基づいて行を選択します。

ノート:文字列に基づいて列をフィルタするには、Oracle GoldenGate文字列関数のいずれかを使用するか、WHERE句を使用します。

TABLE文でのFILTERの構文は次のとおりです。

TABLE source_table
, FILTER (
[, ON INSERT | ON UPDATE| ON DELETE]
[, IGNORE INSERT | IGNORE UPDATE | IGNORE DELETE]
, filter_clause);

MAP文でのFILTERの構文は次のとおりで、エラー処理オプションがあります。

MAP source_table, TARGET target_table,
, FILTER (
[, ON INSERT | ON UPDATE| ON DELETE]
[, IGNORE INSERT | IGNORE UPDATE | IGNORE DELETE]
[, RAISEERROR error_number]
, filter_clause);

FILTER句の有効な要素は、次のとおりです。

次のFILTERオプションを使用して、フィルタ句の影響を受けるSQL操作を指定します。これらのオプションは、任意に結合できます。

ON INSERT | ON UPDATE | ON DELETE IGNORE INSERT | IGNORE UPDATE | IGNORE DELETE

MAPパラメータのFILTERのRAISEERRORオプションを使用して、フィルタに失敗したときのユーザー定義のエラーを生成します。このオプションは、失敗に応じてイベントを起動する必要がある場合に役立ちます。

FILTER句内で@RANGE関数を使用すると、処理のワークロードを複数のMAP文またはTABLE文に分散できます。

サンプルを次に示します:

REPERROR (9999, EXCEPTION)
MAP OWNER.SRCTAB, TARGET OWNER.TARGTAB,
                   SQLEXEC (ID CHECK, ON UPDATE, QUERY ' SELECT COUNT FROM TARGTAB WHERE PKCOL = :P1 ', PARAMS (P1 = PKCOL)),
                   FILTER (BALANCE > 15000),
                   FILTER (ON UPDATE, @BEFORE (COUNT) = CHECK.COUNT)
;
MAP OWNER.SRCTAB, TARGET OWNER.TARGEXC,
EXCEPTIONSONLY,
COLMAP (   USEDEFAULTS,
ERRTYPE = 'UPDATE FILTER FAILED'
)
;

表4複数のFILTER文の使用

パラメータ・ファイル 摘要
REPERROR (9999, EXCEPTION) 指定したエラーに対して例外を起動します。
MAP OWNER.SRCTAB, TARGET OWNER.TARGTAB, MAP文を開始します。
SQLEXEC (ID CHECK, ON UPDATE, QUERY ' SELECT COUNT FROM TARGTAB ' 'WHERE PKCOL = :P1 ', PARAMS (P1 = PKCOL)), 問合せを実行し、更新が発生するたびにCOUNT列の現在の値を取得します。FILTER句を処理する前に問合せまたはストアド・プロシージャを実行できる、BEFOREFILTERオプションもあります。これにより、SQLEXECの部分の値が、実行時にFILTERの内部で使用できるようになります。
FILTER (BALANCE > 15000), FILTER句を使用して、残高が15000を超える行を選択します。
FILTER (ON UPDATE, @BEFORE (COUNT) = CHECK.COUNT) 別のFILTER句を使用して、更新前のCOUNTソース列の値がターゲットの更新適用前のターゲット列の値と一致することを保証します。
; セミコロンでMAP文を終了します。
MAP OWNER.SRCTAB, TARGET OWNER.TARGEXC, EXCEPTIONSONLY, COLMAP (USEDEFAULTS, ERRTYPE = 'UPDATE FILTER FAILED'); 例外MAP文を指定します。エラー9999のREPERROR句によって、TARGEXCに対する例外マップが実行されます。

例9-5 @COMPUTE関数のコール

次の例では、@COMPUTE関数をコールして、価格と数量の積が10,000を超えるレコードを抽出します。

MAP SALES.TCUSTORD, TARGET SALES.TORD,
FILTER (@COMPUTE (PRODUCT_PRICE * PRODUCT_AMOUNT) > 10000);

例9-6 @STREQ関数のコール

次の例では、@STREQ関数を使用して、文字列の値が'JOE'であるレコードを抽出します。

TABLE ACCT.TCUSTORD, FILTER (@STREQ ("Name", 'joe') > 0);

例9-7レコードの選択

次の例では、AMOUNT列が50を超えているレコードを選択し、UPDATEおよびDELETE操作時にフィルタを実行します。

TABLE ACT.TCUSTORD, FILTER (ON UPDATE, ON DELETE, AMOUNT > 50);

例9-8 @RANGE関数の使用方法

(Replicatグループ1のパラメータ・ファイル)

MAP sales.acct, TARGET sales.acct, FILTER (@RANGE (1, 2, ID));

(Replicatグループ2のパラメータ・ファイル)

MAP sales.acct, TARGET sales.acct, FILTER (@RANGE (2, 2, ID));

Replicatのパラメータ・ファイルの一部を示した表9-4に示すように、1つのMAP文またはTABLE文内で複数のFILTER句を結合できます。Oracle GoldenGateでは、フィルタはいずれか1つが失敗するか、すべてが成功するまでリスト順に実行されます。1つのフィルタが失敗すると、フィルタ全体が失敗します。

WHERE句を使用した行の選択

WHERE 句で表9-5の任意の要素を使用し、条件文に基づいて行の選択または除外(あるいはその両方)を実行します。各WHERE句は、カッコで囲む必要があります。リテラルを一重引用符で囲む必要があります。

表5許可されているWHERE演算子

エレメント 例
列名 PRODUCT_AMT
数値 -123, 5500.123
リテラル文字 'AUTO', 'Ca'
組込みの列テスト @NULL、@PRESENT、@ABSENT (行の列がNULL、存在または欠落)。これらのテストは、Oracle GoldenGateに組み込まれています。「FILTERおよびWHEREを使用して行を選択する場合の考慮事項」を参照してください。
比較の演算子 =, <>, >, <, >=, <=
結合演算子 AND, OR
グループ化用カッコ 複数の要素の論理グループ化用に開きカッコと閉じカッコ( )を使用します。

Oracle GoldenGateでは、マルチバイト文字セットまたはローカル・オペレーティング・システムの文字セットと互換性のない文字セットを含む列に対して、FILTERをサポートしていません。

算術演算子および浮動小数点データ型は、WHEREではサポートされません。より複雑な選択条件を使用するには、FILTER句を使用するか、ユーザー・イグジット・ルーチンを使用します。

WHEREの構文は、TABLE文でもMAP文でも同じです。

TABLE table, WHERE (clause);
MAP source_table, TARGET target_table, WHERE (clause);

FILTERおよびWHEREを使用して行を選択する場合の考慮事項

適切な選択句を作成するために、次の推奨事項が役立ちます。ノート:この項の例は、大/小文字が区別されるデータベースを想定しています。

フィルタでのデータ使用可能性の確保

データベースで、変更された列の値のみをトランザクション・ログにログ記録している場合、変更されていない列のいずれかを選択基準によって参照されると、エラーが発生する可能性があります。Oracle GoldenGateは、このような行操作を無視し、それらを破棄ファイルに出力して警告を発行します。

欠落列エラーを回避するには、次のように選択条件を作成します。

TABLE DEMO.PEOPLE, FETCHBEFOREFILTER, FETCHCOLS (age), FILTER (age > 50);
column_name {= | <>} {@PRESENT | @ABSENT}

次の例では、amount列が10,000を超えている場合にすべてのレコードが戻されます。amountが存在しない場合、レコードは破棄されません。

WHERE (amount = @PRESENT AND amount > 10000)

列値の比較

比較で使用される要素が確実に一致するように、該当する列タイプを比較します。

NULL値のテスト

列がNULL値であるかどうかを評価するには、次の構文を使用します。

column {= | <>} @NULL

次の例では、列値がNULLの場合にのみTRUEが戻され、行がレプリケートされます。他のすべての場合(レコードから列が欠落している場合を含む)、FALSEを返します。

WHERE (amount = @NULL)

次の例では、列がレコードに存在し、NULLではない場合にのみTRUEが戻されます。

WHERE (amount = @PRESENT AND amount <> @NULL)

ノート:証跡内の値が4000バイトを超える場合、@NULL関数はTRUEを返します。

変更前および変更後の値の取得

更新および削除操作では、ソース列の変更前の値(更新発生前の値)を取得すると役立つことがあります。挿入の場合は、すべての列値が変更後イメージとみなされます。

これらの値は証跡に格納されており、フィルタおよび列マッピングで使用できます。たとえば、次のようなことができます。

変更前の値を参照する手順

  1. 次のように、@BEFORE列変換関数と、変更前の値を必要とする列の名前を指定します。

    @BEFORE (column_name)

  2. GETUPDATEBEFORESパラメータをExtractのパラメータ・ファイルで使用して、トランザクション・レコードから変更前イメージを取得するか、Replicatのパラメータ・ファイルで使用して、列マッピングまたはフィルタで変更前イメージを使用します。競合の検出および解決(CDR)機能を使用する場合は、TABLEのGETBEFORECOLSオプションを使用できます。これらのパラメータを使用するには、すべての列がトランザクション・ログに存在している必要があります。データベースで、変更された列の値のみを記録している場合、@BEFORE関数を使用すると、列の欠落状態が発生し、列がレコードに存在しない場合と同じように列マップが実行されます。列値の使用可能性を確保するには、「フィルタでのデータ使用可能性の確保」を参照してください。

    Oracle GoldenGateには、フィルタリング、変換関数または他の目的で必要な場合に変換後の値を取得する@AFTER関数も用意されています。Oracle GoldenGateパラメータおよび機能リファレンスの@BEFOREおよび@AFTERを参照してください。

列の選択

Oracle GoldenGateによって抽出するソース表の列を制御するには、TABLEパラメータのCOLSオプションおよびCOLSEXCEPTオプションを使用します。COLSでは抽出する列を選択し、COLSEXCEPTでは、COLSEXCEPTで指定した列以外のすべての列を選択します。

抽出する列を制限すると、ターゲット表にソース表と同じ列が含まれない場合や、列に機密情報(個人識別番号その他の固有のビジネス情報など)が含まれる場合に役立ちます。

SQL操作選択および変換

デフォルトでは、Oracle GoldenGateによってINSERT、UPDATEおよびDELETE操作が取得および適用されます。ExtractまたはReplicatのパラメータ・ファイルで次のパラメータを使用して、処理する操作の種類(挿入のみ、または挿入と更新のみなど)を制御できます。

GETINSERTS | IGNOREINSERTS

GETUPDATES | IGNOREUPDATES

GETDELETES | IGNOREDELETES

Replicatパラメータ・ファイルで次のパラメータを使用すると、あるタイプのSQL操作を別のタイプに変換できます。

トランザクション履歴の使用

Oracle GoldenGateでは、ターゲット・レコードに対する変更の履歴を保持して、各変更の原因となった操作に関する情報をマップできます。この履歴は、各レコードの最新バージョンのみを含むのではなく、表に対して実行されたすべての操作の個別レコードを含むトランザクションベースのレポート・システムを作成する場合に役立ちます。

たとえば、CUSTOMERという名前のターゲット表に対して行われた次の一連の操作では、ID Daveの履歴が残りません。最後の操作でレコードを削除するため、Daveの口座の履歴や末尾残高を知ることはできません。

表6 CUSTOMER表の操作履歴

シーケンス オペレーション ID BALANCE
1 Insert Dave 1000
2 Update Dave 900
3 Update Dave 1250
4 Delete Dave 1250

一連のレコードとしてこの履歴を保持すると、多くの場面で役立ちます。たとえば、トランザクションの正味の効果を生成できます。

トランザクション・レポートを実装する手順

  1. 変更前の値を取得するようにExtractを準備するため、Extractのパラメータ・ファイルでGETUPDATEBEFORESパラメータを使用します。変更前の値(または変更前イメージ)は、更新が実行される前に列に存在する値です。変更前イメージによって、Oracle GoldenGateでトランザクション・レコードを作成できます。

  2. 挿入としてすべての操作を適用するようにReplicatを準備するため、Replicatのパラメータ・ファイルでINSERTALLRECORDSパラメータを使用します。表に対する各操作は、その表内の新規レコードになります。

  3. トランザクション履歴をマップするため、@GETENV列変換関数のGGHEADERオプションの戻り値を使用します。TABLEパラメータまたはMAPパラメータは、COLMAP文に、ソース式として変換関数を含めます。

表9-6に示されている一連のサンプル・トランザクションを使用して、データベースの最新状態ではなく、よりトランザクション指向のより強い顧客ビューを生成するために、次のパラメータ構成を作成できます。

プロセス パラメータ文
Extract GETUPDATEBEFORES TABLE ACCOUNT.CUSTOMER;
Replicat INSERTALLRECORDS MAP SALES.CUSTOMER, TARGET SALES.CUSTHIST, COLMAP (TS = @GETENV ('GGHEADER', 'COMMITTIMESTAMP'), BEFORE_AFTER = @GETENV ('GGHEADER', 'BEFOREAFTERINDICATOR'), OP_TYPE = @GETENV ('GGHEADER', 'OPTYPE'), ID = ID, BALANCE = BALANCE);

ノート:この例は、Oracle GoldenGateプロセスの完全なパラメータ・ファイルを表していません。これらの例が、大/小文字が区別されないデータベースを表していることにも注意してください。

この構成によって、各トランザクションの正味合計と、トランザクションの時刻および顧客IDを戻す次のような問合せが可能になります。

SELECT AFTER.ID, AFTER.TS, AFTER.BALANCE - BEFORE.BALANCE
FROM CUSTHIST AFTER, CUSTHIST BEFORE
WHERE AFTER.ID = BEFORE.ID AND AFTER.TS = BEFORE.TS AND
AFTER.BEFORE_AFTER = 'A' AND BEFORE.BEFORE_AFTER = 'B';